废话不多说,直奔主题。

什么是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. 二、robotframework接口测试-常用关键字介绍

    1.常用关键字介绍: a. 打印:log                                                  用法:log   打印内容 ---------------- ...

  2. pyinstaller-python->exe

    pip install pyinstaller. pyinstaller -F /home/base64_decode.py https://www.imooc.com/article/26772 h ...

  3. Elasticsearch 安装head插件

    一.简介 elasticsearch-head是一个界面化的集群操作和管理工具,可以对集群进行傻瓜式操作.你可以通过插件把它集成到es(首选方式),也可以安装成一个独立webapp. Elastics ...

  4. vs2010发布网站时有些文件没有发布出去的解决办法。

    项目中包含了一些ttf字体文件做为图标使用,可是发布时发现生成的目录中没有这个文件,这种情况这么设置一下就可以解决: 1,在文件上点击右键,选择“属性”. 2,在弹出的属性窗口中,更改“生成操作”为“ ...

  5. Flask框架 (四)—— 请求上下文源码分析、g对象、第三方插件(flask_session、flask_script、wtforms)、信号

    Flask框架 (四)—— 请求上下文源码分析.g对象.第三方插件(flask_session.flask_script.wtforms).信号 目录 请求上下文源码分析.g对象.第三方插件(flas ...

  6. python函数-内置函数

    官方文档[http://www.cnblogs.com/dingkailinux/p/7954484.html] 1.int()函数,表示整形,如 1,2,-1,-2. 2.float()函数,表示浮 ...

  7. 语言I—2019秋作业02

    这个作业属于那个课程 这个作业要求在哪里 我在这个课程的目标是 这个作业在那个具体方面帮助我实现目标 参考文献 C语言程序设计I https://edu.cnblogs.com/campus/zswx ...

  8. Nginx日志监控 使用 goaccess查看nginx日志

    nginx日志监控 yum install goaccess   安装使用教程 goaccess access.log -o ../html/report.html --real-time-html ...

  9. spring maven依赖

    图解spring容器 核心容器(core container) spring-core 这个jar 文件包含Spring 框架基本的核心工具类.Spring 其它组件要都要使用到这个包里的类,是其它组 ...

  10. mui前端框架下拉刷新分页加载数据

    前台 mui.init(); (function($) { //阻尼系数 var deceleration = mui.os.ios?0.003:0.0009; $('.mui-scroll-wrap ...