@Dale-Lin
2020-05-05T19:26:05.000000Z
字数 1562
阅读 631
JavaScript
通过闭包 + setTimeout,保存一个能否执行的 token,如果不可执行,则 return;否则执行。执行语句最后应该将 token 改为可执行。
function throttle(fn, interval = 500) {
const _fn = fn;
let timer, firstTime = true;
return function(...args) {
const that = this;
if (firstTime) {
_fn.call(that, ...args);
firstTime = false;
return;
}
if (timer) {
return;
}
timer = setTimeout(() => {
timer = null;
_fn.call(that, ...args);
}, interval)
}
}
通过闭包,保存一个标记 setTimeout 的值,每次输入时 clearTimeout 已有值,重新 setTimeout。这样就能保证输入字符后的 interval 内触发时,不重复执行。
function debounce(func, wait) {
const _fn = func;
let time;
return function(...args) {
const that = this;
clearTimeout(time);
time = setTimeout(() => {_fn.apply(this, args)}, wait)
}
}
区别是,防抖(debounce)会重新计算间隔时间;而节流(throttle)没有清空计时器,故不会重新计算间隔时间
短时间内向页面中添加大量的 DOM 节点会导致浏览器卡顿或假死。
分时函数用来控制一定时间内的处理数量。
第一个参数是数据集合,第二个是创建添加节点的函数,第三个是每一次创建节点的数量:
const timeChunk = (arr, fn, count = 8) => {
let t;
const createNode = () => {
for (let i = 0; i < Math.min(count, len); i++) {
const obj = arr.shift();
fn(obj);
}
}
return () => {
t = setInterval(() => {
if (arr.length === 0) return clearInterval(t);
createNode();
}, 200);
};
};
创建好后清除计时器,也可以手动修改间隔时间等参数。
开发中因为浏览器之间的差异,一些嗅探工作不可避免,addEventListener 和 attachEvent 的区别。
需要注意的是这些嗅探其实只需要执行一次就可以了,通过在函数内部重写嗅探结果得出的函数(不能用 const 声明了)可以实现惰性加载的函数:
let addEvent = function(ele, type, handler) {
if (window.addEventListener) {
addEvent = function(ele, type, handler) {
ele.addEventListener(type, handler, false);
}
} else if (window.attachEvent) {
addEvent = function (ele, type, handler) {
ele.attachEvent(`on${type}`, handler);
}
}
addEvent(ele, type, handler);
}