废话不多说,直奔主题。

什么是throttle和debounce?

这两个方法的主要目的多是用于性能优化。最常见的应用尝尽就是在通过监听resize、scroll、mouseover等事件时候的性能消耗。拿scroll来说,没有处理时滑动一次滚动条scroll事件会触发多次,如果其中涉及的代码偏重,那么性能消耗肯定是非常大。使用节流和防抖就是去优化这种情况,通过同的使用场景决定使用的对象,接下来就对比一下两者的区别。

throttle

在指定的delay(延迟时间)内,在delay间隔内多次调用,throttle会舍弃中间的所有调用操作,直到用户停止行为后的delay后执行一次预期执行函数。这就称为函数节流。

debounce

跟节流函数一样,debounce也是在设定的delay间隔内多次调用执行函数的话,会舍弃这些操作。和throttle不同的是,debounce多了个强制执行时间参数mustRunDelay,不管前面舍弃了多少次操作,一旦时间tag>=mustRunDelay的话,执行函数一定会被调用一次。接下来上代码,更直观。

原文参考源代码出处

原文对于节流和防抖的描述有待商榷,但是最终的代码其实就是节流和防抖的综合体。通过是否传入mustRunDelay参数来区分。

function throttle (fn, delay, mustRunDelay = 0) {
let timer = null;
let tStart; //创建父级作用域时间tag
return function () {
const context = this;
const args = arguments;
const tCurr = +new Date();//子作用域时间tag
clearTimeout(timer);//每次执行,先清空定时器,这步操作便是delay时间内舍弃多余操作的实现
if (!tStart) { // 首次给时间tag赋值
tStart = tCurr;
}
//这层判断就是判断是否达到强制执行的条件
if (mustRunDelay !== 0 && tCurr - tStart >= mustRunDelay) {
fn.apply(context, args);
tStart = tCurr;
} else {
timer = setTimeout(function () {
fn.apply(context, args);
}, delay);
}
};
}

忽略throttle的方法名,按照调用方式不同,他也可以是debounce。主要实现在于通过异步操作的事件间隔,对于前后两次调用方法打时间tag进行比较,用清空定时器的操作实现多余调用操作的舍弃。还有一点是用了闭包的机制,便于管理tStart变量,因为闭包的关系,tStart内存不会被回收,否则需要在全局定义该变量。

结尾

具体怎么用呢,拿scroll事件举个例子:

window.addEventListenr('scroll',throttle(scrollHandle,delay,mustRunDelay),false);

大概就这意思,使用时候根据场景使用,mustRunDelay>0?防抖:节流。

关于js节流函数throttle和防抖动debounce的更多相关文章

  1. js 节流函数 throttle

    /* * 频率控制 返回函数连续调用时,fn 执行频率限定为每多少时间执行一次 * @param fn {function} 需要调用的函数 * @param delay {number} 延迟时间, ...

  2. Javascript中 节流函数 throttle 与 防抖函数 debounce

    问题的引出 在一些场景往往由于事件频繁被触发,因而频繁地进行DOM操作.资源加载,导致UI停顿甚至浏览器崩溃. 在这样的情况下,我们实际上的需求大多为停止改变大小n毫秒后执行后续处理:而其他事件大多的 ...

  3. 浅谈 Underscore.js 中 _.throttle 和 _.debounce 的差异

    Underscore.js是一个很精干的库,压缩后只有5.2KB.它提供了几十种函数式编程的方法,弥补了标准库的不足,大大方便了JavaScript的编程. 本文仅探讨Underscore.js的两个 ...

  4. js节流函数和js防止重复提交的N种方法

    应用情景 经典使用情景:js的一些事件,比如:onresize.scroll.mousemove.mousehover等: 还比如:手抖.手误.服务器没有响应之前的重复点击: 这些都是没有意义的,重复 ...

  5. 浅谈 Unserscore.js 中 _.throttle 和 _.debounce 的差异

    来源:http://blog.coding.net/blog/the-difference-between-throttle-and-debounce-in-underscorejs Unsersco ...

  6. js节流函数高级版

    节流函数其主要作用就是防止用户在短时间内多次触发该事件. <!DOCTYPE html> <html lang="en"> <head> < ...

  7. 简单的节流函数throttle

    在实际项目中,总会遇到一些函数频繁调用的情况,比如window.resize,mouseover,上传进度类似的触发频率比较高的函数,造成很大的性能损耗,这里可以使用节流函数来进行性能优化,主要是限制 ...

  8. Underscore.js 中 _.throttle 和 _.debounce 的差异

    两个方法都是用来控制事件的频率的,在mousemove,resize等这种高频率触发事件中,控制其响应频率可以明显提高程序的流畅性,减少资源的占用. 通过分析其源代码: _.throttle方法源码 ...

  9. JavaScript 节流函数 Throttle 详解

    在浏览器 DOM 事件里面,有一些事件会随着用户的操作不间断触发.比如:重新调整浏览器窗口大小(resize),浏览器页面滚动(scroll),鼠标移动(mousemove).也就是说用户在触发这些浏 ...

随机推荐

  1. 清北学堂2019.7.18 & 清北学堂2019.7.19

    Day 6 钟皓曦 经典题目:石子合并 可以合并任意两堆,代价为数量的异或(^)和 f[s]把s的二进制所对应石子合并成一堆所花代价 枚举s的子集 #include<iostream> u ...

  2. 什么是HOOK功能?

    HOOK API是一个永恒的话题,如果没有HOOK,许多技术将很难实现,也许根本不能实现.这里所说的API,是广义上的API,它包括DOS下的中断,WINDOWS里的API.中断服务.IFS和NDIS ...

  3. node服务通过Jenkins上线流程

    构建流程 构建服务器: 拉取指定分支代码 构建服务器: 安装依赖 构建服务器: 执行构建 构建服务器: 如果上线流程,则在 git 上创建 tag,供回滚使用 构建服务器:打包 node 服务代码,和 ...

  4. windows下eclipse打不开

    报错找不到jre等东西 因为eclipse到不到javaw.exe 将其写入eclipse.ini即可 在eclipse.ini的前面加上 -vm D:\dev_tool\java\jdk1.7.0_ ...

  5. nginx实现域名跳转

    server { listen 80; server_name www.dd.com www.tt.com; index index.html index.htm index.php; root /u ...

  6. delphi 进程通讯之WM_COPYDATA 发送程序(SendData.exe) 可用

    http://www.delphitop.com/html/wangluo/1529.html delphi 进程通讯之WM_COPYDATA 发送程序(SendData.exe) 作者:admin ...

  7. 【VS开发】C++调用外部程序

    关于三个SDK函数:WinExec, ShellExecute,CreateProcess的其他注意事项:[1]定义头文件必须定义以下两个头文件: [cpp] view plain copy #inc ...

  8. Mac021--编辑软件

    一.思维导图MindNode 知乎Mac常用的思维导图:https://zhuanlan.zhihu.com/p/37768277 MindNode下载地址:https://macblcom.ctfi ...

  9. Grafana设置匿名登录

    将配置文件中的auth.anonymous的enabled设置为true就可以匿名登录,不用输入用户名和密码 #################################### Anonymou ...

  10. [转帖]NetSuite 进入中国市场满一年,甲骨文公布首份成绩单

    NetSuite 进入中国市场满一年,甲骨文公布首份成绩单 https://baijiahao.baidu.com/s?id=1617073148682281883&wfr=spider&am ...