防抖函數(可用於防止重復提交)
當持續觸發事件時,一定時間段內沒有再觸發事件,事件處理函數才會執行一次, 如果設定時間到來之前,又觸發了事件,就重新開始延時。也就是說當一個用戶一直觸發這個函數,且每次觸發函數的間隔小於既定時間,那么防抖的情況下只會執行一次。
/**
* 防抖函數(可用於防止重復提交)
* 當持續觸發事件時,一定時間段內沒有再觸發事件,事件處理函數才會執行一次,
* 如果設定時間到來之前,又觸發了事件,就重新開始延時。也就是說當一個用戶一直觸發這個函數,
* 且每次觸發函數的間隔小於既定時間,那么防抖的情況下只會執行一次。
*
* @param func 執行函數
* @param wait 間隔時間
* @param immediate 立即執行
*/
function debounce(fn, wait, immediate) {
let timer;
return function() {
if (timer) clearTimeout(timer);
if (immediate) {
// 如果已經執行過,不再執行
var callNow = !timer;
timer = setTimeout(() => {
timer = null;
}, wait)
if (callNow) {
fn.apply(this, arguments)
}
} else {
timer = setTimeout(() => {
fn.apply(this, arguments)
}, wait);
}
}
}
節流函數
當持續觸發事件時,保證在一定時間內只調用一次事件處理函數,意思就是說,假設一個用戶一直觸發這個函數,且每次觸發小於既定值,函數節流會每隔這個時間調用一次
用一句話總結防抖和節流的區別:防抖是將多次執行變為最后一次執行,節流是將多次執行變為每隔一段時間執行
實現函數節流我們主要有兩種方法:時間戳和定時器
/**
* 節流函數
* 當持續觸發事件時,保證在一定時間內只調用一次事件處理函數,意思就是說,假設一個用戶一直觸發這個函數,且每次觸發
* 小於既定值,函數節流會每隔這個時間調用一次
* 用一句話總結防抖和節流的區別:防抖是將多次執行變為最后一次執行,節流是將多次執行變為每隔一段時間執行
* 實現函數節流我們主要有兩種方法:時間戳和定時器
*
* @param func 執行函數
* @param wait 間隔時間
* @param options 立即執行
* options中 leading:false 表示禁用第一次執行 trailing: false 表示禁用停止觸發的回調
*/
function throttle(fn, wait, options = {}) {
let timer;
let previous = 0;
let throttled = function() {
let now = +new Date();
// remaining 不觸發下一次函數的剩余時間
if (!previous && options.leading === false) previous = now;
let remaining = wait - (now - previous);
if (remaining < 0) {
if (timer) {
clearTimeout(timer);
timer = null;
}
previous = now;
fn.apply(this, arguments)
} else if (!timer && options.trailing !== false) {
timer = setTimeout(() => {
previous = options.leading === false ? 0 : new Date().getTime();
timer = null;
fn.apply(this, arguments);
}, remaining);
}
}
return throttled;
}