函數(shù)防抖
函數(shù)防抖(debounce):你盡管觸發(fā)事件四康,但是我一定在事件觸發(fā) n 秒后才執(zhí)行,如果你在一個事件觸發(fā)的 n 秒內又觸發(fā)了這個事件,那我就以新的事件的時間為準,n 秒后才執(zhí)行钦铁,總之,就是要等你觸發(fā)完事件 n 秒內不再觸發(fā)事件蹋嵌,我才執(zhí)行育瓜!
function debounce(func, wait) {
var timeout;
return function () {
var context = this; // 將 this 指向正確的對象。
var args = arguments; // 讓 func 有event對象
clearTimeout(timeout)
timeout = setTimeout(function(){
func.apply(context, args)
}, wait);
}
}
// test
function test(e) {
console.log(e);
};
var app = document.getElementById('app');
app.onmousemove = debounce(test,1000)
節(jié)流函數(shù)
如果你持續(xù)觸發(fā)事件栽烂,每隔一段時間,只執(zhí)行一次事件恋脚。
節(jié)流有兩種主流的實現(xiàn)方式腺办,一種是使用時間戳,一種是設置定時器糟描。
使用時間戳
當觸發(fā)事件的時候怀喉,我們取出當前的時間戳,然后減去之前的時間戳(最一開始值設為 0 )船响,如果大于設置的時間周期躬拢,就執(zhí)行函數(shù),然后更新時間戳為當前的時間戳见间,如果小于聊闯,就不執(zhí)行。
function throttle(func, wait) {
var context, args;
var previous = 0;
return function() {
var now = +new Date();
context = this;
args = arguments;
if (now - previous > wait) {
func.apply(context, args);
previous = now;
}
}
}
使用定時器
當觸發(fā)事件的時候米诉,我們設置一個定時器菱蔬,再觸發(fā)事件的時候,如果定時器存在,就不執(zhí)行拴泌,直到定時器執(zhí)行魏身,然后執(zhí)行函數(shù),清空定時器蚪腐,這樣就可以設置下個定時器箭昵。
function throttle(func, wait) {
var timeout;
var previous = 0;
return function() {
context = this;
args = arguments;
if (!timeout) {
timeout = setTimeout(function(){
timeout = null;
func.apply(context, args)
}, wait)
}
}
}
比較兩個方法
1.第一種事件會立刻執(zhí)行,第二種事件會在 n 秒后第一次執(zhí)行;
2.第一種事件停止觸發(fā)后沒有辦法再執(zhí)行事件回季,第二種事件停止觸發(fā)后依然會再執(zhí)行一次事件