函数节流与防抖

简介: 函数节流与防抖https://blog.csdn.net/m0_50855872/category_11053037.html

函数节流与防抖

在最近的面试中,有被问到这个问题,当时没有反应过来,整理一下,供大家参考


函数防抖

函数防抖,就是指触发事件后在一定时间内函数只能执行一次,如果在这段时间内再次触发,则会重新计时,直到事件触发后一定时间内不再触发


简单来说,就是在连续多次的触发事件时,只会执行最后一次


因此,实现函数防抖的关键在于判断一定时间内事件是否触发


实现代码

这一部分是用来测试的盒子以及事件触发的回调函数

var box = document.querySelector('.box');
function test() {
  console.log('按了');
}
box.onclick = debounce(test,1000);//绑定一个点击事件,延时1000ms

在解释代码之前先讲一下清除计时器


我一开始以为清除计时器用null和用clear一样,其实不然


所有的计时器都会有一个返回值,这个返回值就是计时器的唯一标识


当我们将定时器名赋予null时,其实只是将计时器的返回值改为了null而已,定时器还是依旧存在的,我们可以做一下的测试代码

function fn () {
    var timer = setInterval(function () {
    console.log('我是定时器');
    timer = null;
    console.log(timer);
}, 1000);
}
fn();//我是定时器 /n   null
fn();//我是定时器 /n   null

很显然,不管调用几次,定时器依旧存在,只是返回值变成了null 因此我们在实现函数防抖不要以为t = null已经清除了定时器,所以我们在防抖函数中,要用clearTimeout清除定时器

function debounce(fn,delay) {
    var t = null;
    return function() {
        if(t) {
            clearTimeout(t);
        }
        t = setTimeout(function(){
            fn.apply(this,arguments);
        },delay)
    }
}

为了封装一个函数,要尽量的避免污染全局变量,因此采用了闭包,将t作为function的私有变量,不污染全局变量


最后一个问题


为什么要用apply呢?


return以及函数它的调用者都是window,所以这里不存在this指向的问题,但当我们需要传入参数数组时,而这个参数个数又不确定,我们只能用argument来接受不确定个数的参数,因为fn接受的是单一的参数,而不是数组,因此我们采用apply来接受这个数组


函数节流

函数节流是限制一个函数在一定时间内只能执行一次


有了函数防抖的基础,节流操作就简单很多了


实现函数节流的主要是要计算每次触发事件的时间差,如果两次触发事件的时间差大于设定的时间,则直接执行,如果小于,则等待执行。


实现代码

我相信初学者一定和我一样有很多的小问号

function throttle(fn,delay) {
    var t = null;
    begin = new Date().getTime();
    return function() {
        cur = new Date().getTime();
        clearTimeout(t);
        if(cur - begin >= delay) {
            fn.apply(this,arguments);
            begin = cur;
        }else {
            t = setTimeout(function(){
                fn.apply(this,arguments);
            },delay)
        }
    }
}

这个函数是怎么的一个流程呢?


首先当用户点击时,会获取当前的时间戳,也就是点击的时刻,begin作为初始的时间与cur做比较,也就是当前点击的时间距离上次点击时间大于delay会立即执行,如果小于delay就会创建一个定时器,经过delay秒后再执行


如果再这个delay的时间内疯狂点击会发生什么呢?


很显然当前的时间戳也就是cur会不断的随时间变大,当时间差大于了delay就会满足if的条件,直接执行


也就是说,当我们连续点击时,只有当我们停下前的那一次点击事件会通过else里的函数输出,其余的都会从满足if条件的输出!


相关文章
|
2天前
|
数据采集 人工智能 安全
|
12天前
|
云安全 监控 安全
|
4天前
|
自然语言处理 API
万相 Wan2.6 全新升级发布!人人都能当导演的时代来了
通义万相2.6全新升级,支持文生图、图生视频、文生视频,打造电影级创作体验。智能分镜、角色扮演、音画同步,让创意一键成片,大众也能轻松制作高质量短视频。
1037 151
|
3天前
|
编解码 人工智能 机器人
通义万相2.6,模型使用指南
智能分镜 | 多镜头叙事 | 支持15秒视频生成 | 高品质声音生成 | 多人稳定对话
|
17天前
|
机器学习/深度学习 人工智能 自然语言处理
Z-Image:冲击体验上限的下一代图像生成模型
通义实验室推出全新文生图模型Z-Image,以6B参数实现“快、稳、轻、准”突破。Turbo版本仅需8步亚秒级生成,支持16GB显存设备,中英双语理解与文字渲染尤为出色,真实感和美学表现媲美国际顶尖模型,被誉为“最值得关注的开源生图模型之一”。
1727 9
|
9天前
|
人工智能 自然语言处理 API
一句话生成拓扑图!AI+Draw.io 封神开源组合,工具让你的效率爆炸
一句话生成拓扑图!next-ai-draw-io 结合 AI 与 Draw.io,通过自然语言秒出架构图,支持私有部署、免费大模型接口,彻底解放生产力,绘图效率直接爆炸。
680 152
|
11天前
|
人工智能 安全 前端开发
AgentScope Java v1.0 发布,让 Java 开发者轻松构建企业级 Agentic 应用
AgentScope 重磅发布 Java 版本,拥抱企业开发主流技术栈。
641 13
|
5天前
|
SQL 自然语言处理 调度
Agent Skills 的一次工程实践
**本文采用 Agent Skills 实现整体智能体**,开发框架采用 AgentScope,模型使用 **qwen3-max**。Agent Skills 是 Anthropic 新推出的一种有别于mcp server的一种开发方式,用于为 AI **引入可共享的专业技能**。经验封装到**可发现、可复用的能力单元**中,每个技能以文件夹形式存在,包含特定任务的指导性说明(SKILL.md 文件)、脚本代码和资源等 。大模型可以根据需要动态加载这些技能,从而扩展自身的功能。目前不少国内外的一些框架也开始支持此种的开发方式,详细介绍如下。
400 4