自定义函数节流
在前端开发中,有时会为页面绑定 resize 事件,或者为一个页面元素绑定拖拽事件(其核心就是绑定 mousemove),这种事件有一个特点,就是用户不必特地捣乱,他在一个正常的操作中,都有可能在一个短的时间内触发非常多次事件绑定程序。
而大家知道,DOM 操作时很消耗性能的,这个时候,如果你为这些事件绑定一些操作 DOM 节点的操作的话,那就会引发大量的计算,在用户看来,页面可能就一时间没有响应,这个页面一下子变卡了变慢了。甚至在 IE 下,如果你绑定的 resize 事件进行较多 DOM 操作,其高频率可能直接就使得浏览器崩溃。
怎么解决?函数节流就是一种办法。
var throttle = function (fn, delay, mustRunDelay) {
let timer = null;
let startTime;
return function () {
let context = this, endTime = +new Date(), args = arguments;
clearTimeout(timer);
if (!startTime) {
startTime = endTime;
} else if (endTime - startTime >= mustRunDelay) {
fn.apply(context, args);
startTime = endTime;
} else {
timer = setTimeout(function () {
fn.apply(context, args);
}, delay);
}
}
}
来源整理自:vue3js.cn 面试官系列



