function resizeHandler() {
console.log(this);
}
window.onresize = debounce(resizeHandler, 500);
function inputHandler() {
console.log(this);
}
document.getElementById("input").oninput = debounce(inputHandler, 500);
更进一步,我们不希望非要等到事件停止触发后才执行,我希望立刻执行函数,然后等到停止触发 n 秒后,才可以重新触发执行
这里增加一个 immediate 参数来设置是否要立即执行
function debounce(func, delay, immediate) {
var timer = null;
return function () {
var context = this;
var args = arguments;
if (timer) clearTimeout(timer);
if (immediate) {
//根据距离上次触发操作的时间是否到达delay来决定是否要现在执行函数
var doNow = !timer;
//每一次都重新设置timer,就是要保证每一次执行的至少delay秒后才可以执行
timer = setTimeout(function () {
timer = null;
}, delay);
//立即执行
if (doNow) {
func.apply(context, args);
}
} else {
timer = setTimeout(function () {
func.apply(context, args);
}, delay);
}
}
}
节流
函数预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期
// throttle
function throttle(method, duration) {
var begin = new Date();
return function () {
var context = this,
args = arguments,
current = new Date();
if (current - begin >= duration) {
method.apply(context, args);
begin = current;
}
}
}
去抖
函数调用 n 秒后才会执行,如果函数在 n 秒内被调用的话则函数不执行,重新计算执行时间,这里的原理是利用了一个闭包,每当有事件被监听就清除闭包中
timer
,重新赋值比如
resize()
一瞬间调用了很多次,只会延迟触发最后一次调用,再比如用户在短时间触发了很多次输入动作oninput
,就会延迟只触发最后一次,我们可以把它用在scroll、resize和input
这些事件监听上,减少不必要的性能开销,还可以在下列事件下做去抖处理window
对象的resize、scroll
事件mousemove
事件mousedown、keydown
事件keyup
事件更进一步,我们不希望非要等到事件停止触发后才执行,我希望立刻执行函数,然后等到停止触发 n 秒后,才可以重新触发执行 这里增加一个 immediate 参数来设置是否要立即执行
节流
函数预先设定一个执行周期,当调用动作的时刻大于等于执行周期则执行该动作,然后进入下一个新周期
Vscode 的写法
vscode/extensions/git/src/decorators.ts
参考文档