题目链接
思路
题目提到时间内再次调用需要取消上一次调用,我们从 setTimeout 里面可以知道,该函数返回一个number类型,并且会延迟执行
可以根据当前 timer 是否为 null 的值 ,知道当前是否已经有 setTimeout 在执行,如果存在 则,使用 clrearTimeout 取消,并重置 timer 的值,最后更新 timer 需要执行的代码
apply,是改变 this 指向,并执行 函数,args 是一个参数数组,所以这里使用了 fn.apply 方法来改变 this 指向并执行 fn
这里有一个小坑,setTimeout 的第一个参数需要是一个回调函数,不能直接执行 fn
代码
javascript
/**
* @param {Function} fn
* @param {number} t milliseconds
* @return {Function}
*/
var debounce = function (fn, t) {
let timer = null
return function (...args) {
if (timer != null) {
clearTimeout(timer)
timer = null
}
timer = setTimeout(() => fn.apply(this, args), t)
}
};
/**
* const log = debounce(console.log, 100);
* log('Hello'); // cancelled
* log('Hello'); // cancelled
* log('Hello'); // Logged at t=100ms
*/