防抖(debounce)
概念
事件被触发经过单位时间(delay)后再执行回调,如果在单位时间内又被触发,则重新计时。
防抖函数
1 | const debounce = (cb, delay = 1000) => { |
若延迟delay设置为1000(默认值),则cb(回调函数)只会在停止触发1s后执行,如果一直不断地触发,则回调函数始终不执行。
使用
下面是一个简单的使用示例,后续介绍的防抖和节流函数的使用方式也是相似的。1
2
3
4
5const callback = () => {
console.log(Math.random());
}
const handle = debounce(callback, 1000);
window.addEventListener('scroll', handle);
防抖函数(第一次触发会立即执行)
1 | const debounceImmediate = (cb, delay = 1000, immediate = true) => { |
当设置immediate=true(默认值)、delay=1000(默认值)时,第一次触发会立即执行回调函数。后续执行和普通的防抖函数一样,只有在停止触发1s后回调函数才会执行,如果还是一直不断地触发,则回调函数始终不执行。
节流(throttle)
概念
规定在单位时间(delay)内,只能触发一次函数。如果单位时间内多次触发函数,只会执行一次回调。
节流函数(使用时间戳)
1 | const throttleUseTimeStamp = (cb, delay = 1000) => { |
若delay=1000,则在1s内只会执行一次回调函数。
节流函数的实现(使用定时器)
1 | const throttleUseTimer = (cb, delay) => { |
若delay=1000,则在1s内只会执行一次回调函数。
节流函数的实现(第一次触发立即执行,最后一次触发也会执行)
1 | const throttleExecMore = function(cb, delay) { |
第一次触发会立即执行回调函数,最后一次触发也会执行一次回调函数。
应用场景举例
防抖
- 搜索联想,在不断输入值时节约请求资源。
- 窗口resize事件
节流
- 鼠标不断点击,单位时间内只触发一次
- 滚动到底部加载更多