博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
函数节流和防抖
阅读量:5798 次
发布时间:2019-06-18

本文共 1566 字,大约阅读时间需要 5 分钟。

throttle

概念:触发函数事件后,短时间间隔内无法连续调用,只有上一次函数执行后,过了规定的时间间隔,才能进行下一次的函数调用 适用场景:窗口调整(resize)、页面滚动(scroll)、抢购疯狂点击(movedown)

function throttle(fn, interval) {    let last = 0;    return function() {        let context = this;        let args = arguments;        let now = new Date.getTime();        if(now - last >= interval) {            fn.apply(context, args);            last = now;        }    }}复制代码

debounce

在特定时间延迟内连续多次触发事件后,事件处理函数只执行一次,并且是在触发操作结束时执行 适用场景: 实时搜索(keyup)、拖拽(mousemove)

function debounce(fn, delay) {    let timer = null;    return function () {        let context = this;        let args = arguments;        clearTimeout(timer);        timer = setTimeout(function() {            fn.apply(this, args);        }, delay);    }}复制代码

## 用 Throttle 来优化 Debounce

如果用户的操作十分频繁——每次都不等 debounce 设置的 delay 时间结束就进行下一次操作,于是每次 debounce 都为该用户重新生成定时器,回调函数被延迟了不计其数次。频繁的延迟会导致用户迟迟得不到响应,用户同样会产生“这个页面卡死了”的观感。

为了避免这个问题,我们需要改进:delay的时间到了,必须要给用户一个响应,也就是要调用一次执行函数。

function throttle(fn, delay) {        let timer = null, last  = 0;        return function() {            let context = this;            let args = arguments;            let now = new Date.getTime();            // 确保delay的时间内至少执行一次            if (now - last >= delay) {                fn.apply(this, args);                last = now;            } else {                clearTimeout(timer);                timer = setTimeout(function() {                    last = now;                    fn.apply(this, args);               }, delay);            }        }    }复制代码

转载于:https://juejin.im/post/5cd1383d518825356e261be4

你可能感兴趣的文章
一、数论算法
查看>>
Asp.net MVC 中Controller的返回类型大全
查看>>
用一条SQL语句实现斐波那契数列
查看>>
[高中作文赏析]跋涉与成功
查看>>
swift-辞典NSDictionary定义,变化的关键,删/加入关键
查看>>
python----slots属性安全类
查看>>
《Programming WPF》翻译 第5章 1.不使用样式
查看>>
.NET垃圾回收:非托管资源,IDispose和析构函数的结合
查看>>
H2内存数据库 支持存储到文件
查看>>
css3处理sprite背景图压缩来解决H5网页在手机浏览器下图标模糊的问题
查看>>
BlockCanary 一个轻量的,非侵入式的性能监控组件(阿里)
查看>>
【HDU 1228】A + B
查看>>
CentOS 7搭建SVN服务器
查看>>
Atitit.远程接口 监控与木马 常用的api 标准化v2 q216
查看>>
linux创建文件树,孩子兄弟树(或广义表),创建文件树及其訪问
查看>>
Floyd最短路算法
查看>>
Class.forName(String name)方法,到底会触发那个类加载器进行类加载行为?
查看>>
CentOS 6.6 FTP install
查看>>
C#------判断btye[]是否为空
查看>>
图解Ajax工作原理
查看>>