写点什么

JavaScript 进阶(五)节流

用户头像
Augus
关注
发布于: 2 小时前
JavaScript进阶(五)节流

节流

都说节流节流,那节流到底是什么呢?其实啊,简单点就是你点击一个按钮多次,他会按照一定时间间隔依次执行。本质和防抖还不⼀样,防抖动是将多次执⾏变为最后⼀次执⾏。


  • 下面我们简单看一下代码实现:


// 这个是⽤来获取当前时间戳的
function now() { return new Date()}
/** * underscore 节流函数,函数连续调⽤时, 每隔一定时间间隔返回 * @param {function} func:回调函数 * @param {number} wait:时间间隔 * @param {object} options: * 忽略开始函数的的调⽤,传⼊{leading: false} * 忽略结尾函数的调⽤,传⼊{trailing: false} * 两者不能共存,否则函数不能执⾏ * @return {function} */function (func, wait, options) { var context, args, result; var timeout = null; // 之前的时间戳 var previous = 0; if (!options) options = {}; // 定时器回调函数 var later = function () { previous = options.leading === false ? 0 : now(); // 置空⼀是为了防⽌内存泄漏,⼆是为了下⾯的定时器判断 timeout = null; result = func.apply(context, args); if (!timeout) context = args = null; }; return function () { // 获得当前时间戳 var now = now(); if (!previous && options.leading === false) previous = now; // 计算剩余时间 var remaining = wait - (now - previous); context = this; args = arguments; if (remaining <= 0 || remaining > wait) { // 如果存在定时器就清理掉避免⼆次回调 if (timeout) { clearTimeout(timeout); timeout = null; } previous = now; result = func.apply(context, args); if (!timeout) context = args = null; } else if (!timeout && options.trailing !== false) { // 判断是否设置了定时器和 trailing // 否的话重新开启⼀个定时器 // 并且不能同时设置 leading 和 trailing timeout = setTimeout(later, remaining); } return result; };};
复制代码


好了,如上就是节流的简单实现版本了。稍微有亿点点复杂,不过多看几遍,相信就能看进去了,书读百遍其义自见嘛,相信自己。


大家,再见,我是 Augus,一个爱瞎搞的软件开发工程师。END~~~

用户头像

Augus

关注

爱瞎搞的软件开发工程师 2021.06.10 加入

某摸鱼集团

评论

发布
暂无评论
JavaScript进阶(五)节流