函数节流与防抖

简介: 函数节流与防抖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条件的输出!


相关文章
|
存储 数据可视化 前端开发
低代码数据可视化GoView项目的初体验
低代码数据可视化GoView项目的初体验
|
云安全 SQL 弹性计算
阿里云提示网站后门发现后门(Webshell)文件的解决办法
2018年10月27日接到新客户网站服务器被上传了webshell脚本木马后门问题的求助,对此我们sine安全公司针对此阿里云提示的安全问题进行了详细分析,ECS服务器被阿里云提示异常网络连接-可疑WebShell通信行为,还会伴有,网站后门-发现后门(Webshell)文件,以及提示网站后门-一句话webshell的安全提示,但是大部分都是单独服务器ECS的用户,具体被阿里云提示的截图如下:
阿里云提示网站后门发现后门(Webshell)文件的解决办法
|
3月前
|
人工智能
AI×OPC的新可能:一个人,就是一支队伍!
AI时代,一人即一队!新浪潮大会聚焦“AI×OPC”新机遇,阿里云、Intel等共探OPC盈利路径与基建选型;首发OPC专属套餐(云服务器+AI工具),低门槛打造公司级生产力,开启轻量化创业新时代!
|
4月前
|
人工智能 监控 安全
《从“糊涂账”到精细化治理:企业级 AI 成本治理与质量审计实战》
AiKey 是面向AI生产环境的FinOps治理基础设施,解决企业AI算力成本高、模型质量难控、凭证管理混乱三大痛点。通过虚拟Key实现多维成本归因,实时模型指纹校验防“降智”,加密Vault动态分发安全凭证。开源CLI已上线,助力AI规模化落地。
364 3
|
4月前
|
存储 缓存 关系型数据库
【MySQL】InnoDB核心架构:Buffer Pool、Change Buffer、redo log、undo log、自适应哈希索引
本文系统梳理InnoDB核心架构,聚焦Buffer Pool、Change Buffer、redo log、undo log与自适应哈希索引五大组件,深入解析其设计原理、协同机制及ACID保障逻辑,涵盖内存/磁盘分层、WAL、MVCC、冷热分离等关键设计,助力深度理解与高效调优。
|
存储 开发框架 前端开发
基于SqlSugar的开发框架循序渐进介绍(13)-- 基于ElementPlus的上传组件进行封装,便于项目使用
基于SqlSugar的开发框架循序渐进介绍(13)-- 基于ElementPlus的上传组件进行封装,便于项目使用
|
存储 安全 数据安全/隐私保护
阿里云服务器五代、六代、七代、八代实例简介及性能提升介绍
随着技术的不断进步,到2025年,阿里云服务器实例也经历了多代升级,从五代实例到最新的八代实例,每一代都在性能、稳定性、能效比等方面取得了显著提升。有的用户由于是初次接触阿里云服务器,所以不是很清楚阿里云服务器五代、六代、七代、八代实例有哪些,它们各自在云服务器性能上有哪些提升。本文将详细介绍阿里云服务器五代、六代、七代、八代实例的特点及性能提升,帮助用户更好地了解并选择适合自己的云服务器实例。
838 29
|
数据采集 Web App开发 数据挖掘
使用Python和BeautifulSoup轻松抓取表格数据
使用Python和BeautifulSoup,结合代理IP,可以从网页抓取表格数据,如中国气象局的天气信息。通过requests库发送HTTP请求,BeautifulSoup解析HTML提取表格。安装必要库后,设置代理IP,发送请求,解析HTML找到表格,提取数据并存储。通过Pandas进行数据分析,如计算平均气温。这种方法让数据抓取和分析变得更加便捷。
810 3
使用Python和BeautifulSoup轻松抓取表格数据
|
开发工具 开发者
如何用 CocosCreator 对接抖音小游戏的侧边栏复访
最近小游戏的软著下来了,用 CocosCreator 做的游戏也完成了 1.0 版本。而当我打包成抖音小游戏进行提交时,还没到初审就给拒了,因为还有一个机审,机器检测到代码中没有接入 “侧边栏复访功能”。这个我还真不知道,那只能去官方看文档了,位置是小游戏开发文档 -> 指南 -> 开放能力 -> 侧边栏能力。
636 2
|
程序员 开发者
黑马程序员 苍穹外卖项目 Day微信支付问题解决与生成订单号超出上限问题
黑马程序员 苍穹外卖项目 Day微信支付问题解决与生成订单号超出上限问题
935 5

热门文章

最新文章