在性能優化實踐中,遇到scroll事件,優先須要考慮節流。 節流函數顧名思義,就是要使密集頻繁觸發的函數,按照有規律有節制的過程去執行,那麼背後的原理是什麼?一步步實現吧。性能優化
var num = 0
window.onscroll = function () {
console.log('回調函數執行' + (++num) + '次')
}
複製代碼
var num = 0
var timer = null
var cb = function(){
console.log('回調函數執行' + (++num) + '次')
}
window.onscroll = function () {
clearTimeout(timer)
timer = setTimeout(() => {
cb()
}, 1000)
}
複製代碼
var num = 0
var cb = function(){
console.log('回調函數執行' + (++num) + '次')
}
var throttle = function (fn, delay) {
var timer = null
return function () {
clearTimeout(timer);
timer = setTimeout(function() {
fn();
}, delay);
}
}
window.onscroll = throttle(cb, 1000)
複製代碼
var num = 0
var cb = function(){
console.log('回調函數執行' + (++num) + '次')
}
var throttle = function (fn, delay, atleast) {
// 聲明定時器
var timer = null
var previous = null
return function () {
// 每次頁面滾動時候都會生成新的時間戳
var now = +new Date()
// 若是是第一次滾動
if ( !previous ) previous = now
// 不斷的滾動,直到時間間隔知足條件,執行回調函數,更新previous,清空定時器
if ( atleast && now - previous > atleast ) {
fn();
previous = now
clearTimeout(timer)
// 不知足時間間隔條件,仍是進函數中先清空上次的定時器
// 並生成新的定時器,
} else {
clearTimeout(timer)
timer = setTimeout(function() {
fn()
}, delay);
}
}
}
window.onscroll = throttle(cb, 1000, 400)
複製代碼