节流的意思是让函数有节制地去执行,而不是毫无节制的触发一次就执行一次。
- 持续触发并不会执行多次
- 到一定时间再去执行
效果:
抓取一个关键的点:就是执行的时机。要做到控制执行的时机,我们可以通过一个开关,与定时器setTimeout结合完成。
持续触发时,关闭开关,等到setTimeout到时间了,打开开关,函数就会执行了。
function throttle(fn, delay) {
let door = true
return function () {
if (!door) return // 如果开关关闭了,那就直接不执行下边的代码
door = false // 持续触发的话,door一直是false,就会停在上边的判断那里
if (door) {
setTimeout(() => {
fn.apply(this, arguments);
door = true // 定时器到时间之后,会把开关打开,我们的函数就会被执行
}, delay);
}
}
}
box.onmousemove = throttle(function (e) {
box.innerHTML = `${e.clientX}, ${e.clientY}`
}, 1000)