JavaScript 进阶(五)节流
发布于: 2 小时前
节流
都说节流节流,那节流到底是什么呢?其实啊,简单点就是你点击一个按钮多次,他会按照一定时间间隔依次执行。本质和防抖还不⼀样,防抖动是将多次执⾏变为最后⼀次执⾏。
下面我们简单看一下代码实现:
// 这个是⽤来获取当前时间戳的
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~~~
划线
评论
复制
发布于: 2 小时前阅读数: 3
Augus
关注
爱瞎搞的软件开发工程师 2021.06.10 加入
某摸鱼集团
评论