防抖(Debouncing)
假設(shè)你正在坐公交抹沪,當(dāng)公交到站后接到人準(zhǔn)備啟動(dòng)車之前發(fā)現(xiàn)還有乘客要乘車,這時(shí)公交司機(jī)會(huì)按下開門開關(guān),然后讓乘客上公交;
如果在坐公交關(guān)門之前财岔,又有人來(lái)了,司機(jī)就會(huì)繼續(xù)開門河爹;這樣一直進(jìn)行下去匠璧,你可能需要等待幾分鐘,最終沒(méi)人要上公交了咸这,才會(huì)關(guān)門夷恍,然后發(fā)車。
let debounce = function (action, delay) {
let timer = null;
return function () {
clearTimeout(timer);
timer = setTimeout(() => {
action.apply(this, arguments);
}, delay);
};
};
// example
function operationFn() {
console.log("debounce---");
}
window.onclick = debounce(operationFn, 500);
節(jié)流(Throttling)
假設(shè)你正在坐公交媳维,當(dāng)公交到站后接到人準(zhǔn)備啟動(dòng)車之前發(fā)現(xiàn)還有乘客要乘車酿雪,這時(shí)公交司機(jī)會(huì)按下開門開關(guān),然后讓乘客上公交侄刽;
但是指黎,這個(gè)公交司機(jī)是沒(méi)耐心的人,司機(jī)最多只會(huì)在這個(gè)站臺(tái)停留一分鐘唠梨;在這一分鐘內(nèi)袋励,司機(jī)會(huì)開門讓乘客進(jìn)來(lái),但是過(guò)了一分鐘之后当叭,司機(jī)就會(huì)關(guān)門,然后發(fā)車盖灸。
let throttle = function (action, delay) {
let statTime = 0;
return function () {
let currTime = +new Date();
// '+'的目的是通過(guò)隱式類型轉(zhuǎn)換將該數(shù)據(jù)類型轉(zhuǎn)換為Number類型蚁鳖,若轉(zhuǎn)換失敗,則返回NaN;
if (currTime - statTime > delay) {
action.apply(this, arguments);
statTime = currTime;
}
};
};
// example
function operationFn() {
console.log("throttle---");
}
window.onclick = throttle(operationFn, 1000);