聊一聊throttle and debounce
两个都可以针对高频操作进行性能优化
debounce(防抖)
debounce表示一段时间后要执行某种操作,假如在执行之前又有了执行信号,就取消之前的延迟操作,产生一个新的延迟操作。
代码实现:
function debounce(fn, wait) {
let timeout = null;
fucntion debounced() {
clearTimeout(timeout)
timeout = setTimeout(() => {
fn.apply(this, arguments)
}, wait)
}
return debounced
}
lodash的实现方式:https://github.com/lodash/lodash/blob/master/debounce.js,它优先使用requestAnimationFrame
它将触发频繁的事件合成一次执行,例如input、keyup、keydown、resize等
throttle(节流)
throttle表示每隔一段时间就执行某种操作
代码实现:
function throttle(fn, wait) {
let timeout = null
let firstRun = true
function throttled() {
if (firstRun) {
firstRun = false
fn.apply(this, arguments)
}
if (timeout) {
return
}
timeout = setTimeout(() => {
clearTimeout(timeout)
fn.apply(this, arguments)
}, wait)
}
return throttled
}
lodash的throttle是基于debounce的
它可以在一段时间中固定触发的次数, 例如scroll、resize等
PS: angular已经有10了🤯