javascript中的throttle和debounce淺析
throttle
我們這里說的throttle就是函數(shù)節(jié)流的意思。再說的通俗一點(diǎn)就是函數(shù)調(diào)用的頻度控制器,是連續(xù)執(zhí)行時(shí)間間隔控制。主要應(yīng)用的場(chǎng)景比如:
1.鼠標(biāo)移動(dòng),mousemove 事件
2.DOM 元素動(dòng)態(tài)定位,window對(duì)象的resize和scroll 事件
有人形象的把上面說的事件形象的比喻成機(jī)關(guān)槍的掃射,throttle就是機(jī)關(guān)槍的扳機(jī),你不放扳機(jī),它就一直掃射。我們開發(fā)時(shí)用的上面這些事件也是一樣,你不松開鼠標(biāo),它的事件就一直觸發(fā)。例如:
var resizeTimer=null;
$(window).on('resize',function(){
if(resizeTimer){
clearTimeout(resizeTimer)
}
resizeTimer=setTimeout(function(){
console.log("window resize");
},400);
debounce
debounce和throttle很像,debounce是空閑時(shí)間必須大于或等于 一定值的時(shí)候,才會(huì)執(zhí)行調(diào)用方法。debounce是空閑時(shí)間的間隔控制。比如我們做autocomplete,這時(shí)需要我們很好的控制輸入文字時(shí)調(diào)用方法時(shí)間間隔。一般時(shí)第一個(gè)輸入的字符馬上開始調(diào)用,根據(jù)一定的時(shí)間間隔重復(fù)調(diào)用執(zhí)行的方法。對(duì)于變態(tài)的輸入,比如按住某一個(gè)建不放的時(shí)候特別有用。
debounce主要應(yīng)用的場(chǎng)景比如:
文本輸入keydown 事件,keyup 事件,例如做autocomplete
這類網(wǎng)上的方法有很多,比如Underscore.js就對(duì)throttle和debounce進(jìn)行封裝。jQuery也有一個(gè)throttle和debounce的插件:jQuery throttle / debounce,所有的原理時(shí)一樣的,實(shí)現(xiàn)的也是同樣的功能。再奉上一個(gè)自己一直再用的throttle和debounce控制函數(shù):
/*
* 頻率控制 返回函數(shù)連續(xù)調(diào)用時(shí),fn 執(zhí)行頻率限定為每多少時(shí)間執(zhí)行一次
* @param fn {function} 需要調(diào)用的函數(shù)
* @param delay {number} 延遲時(shí)間,單位毫秒
* @param immediate {bool} 給 immediate參數(shù)傳遞false 綁定的函數(shù)先執(zhí)行,而不是delay后后執(zhí)行。
* @return {function}實(shí)際調(diào)用函數(shù)
*/
var throttle = function (fn,delay, immediate, debounce) {
var curr = +new Date(),//當(dāng)前事件
last_call = 0,
last_exec = 0,
timer = null,
diff, //時(shí)間差
context,//上下文
args,
exec = function () {
last_exec = curr;
fn.apply(context, args);
};
return function () {
curr= +new Date();
context = this,
args = arguments,
diff = curr - (debounce ? last_call : last_exec) - delay;
clearTimeout(timer);
if (debounce) {
if (immediate) {
timer = setTimeout(exec, delay);
} else if (diff >= 0) {
exec();
}
} else {
if (diff >= 0) {
exec();
} else if (immediate) {
timer = setTimeout(exec, -diff);
}
}
last_call = curr;
}
};
/*
* 空閑控制 返回函數(shù)連續(xù)調(diào)用時(shí),空閑時(shí)間必須大于或等于 delay,fn 才會(huì)執(zhí)行
* @param fn {function} 要調(diào)用的函數(shù)
* @param delay {number} 空閑時(shí)間
* @param immediate {bool} 給 immediate參數(shù)傳遞false 綁定的函數(shù)先執(zhí)行,而不是delay后后執(zhí)行。
* @return {function}實(shí)際調(diào)用函數(shù)
*/
var debounce = function (fn, delay, immediate) {
return throttle(fn, delay, immediate, true);
- javascript函數(shù)的節(jié)流[throttle]與防抖[debounce]
- JavaScript中定時(shí)控制Throttle、Debounce和Immediate詳解
- JavaScript性能優(yōu)化之函數(shù)節(jié)流(throttle)與函數(shù)去抖(debounce)
- 詳解JavaScript節(jié)流函數(shù)中的Throttle
- JavaScript 節(jié)流函數(shù) Throttle 詳解
- Javascript Throttle & Debounce應(yīng)用介紹
- Javascript節(jié)流函數(shù)throttle和防抖函數(shù)debounce
相關(guān)文章
傳智播客學(xué)習(xí)之JavaScript基礎(chǔ)篇
前幾天學(xué)習(xí)了JavaScript,但是一直由于忙碌的原因,沒有來(lái)得及進(jìn)行總結(jié),今天終于有時(shí)間進(jìn)行一個(gè)全面總結(jié)了,希望給正在努力學(xué)習(xí)的朋友們一點(diǎn)小小幫助。2009-11-11Javascript排序算法之合并排序(歸并排序)的2個(gè)例子
這篇文章主要介紹了Javascript排序算法之合并排序(歸并排序)的2個(gè)例子,需要的朋友可以參考下2014-04-04IE6瀏覽器下resize事件被執(zhí)行了多次解決方法
在IE瀏覽器下,一次resize事件被執(zhí)行了多次,這是IE6和IE7的一個(gè)比較廣為認(rèn)知的問題,這個(gè)問題在這兩個(gè)版本的瀏覽器中表現(xiàn)有所不同,通常IE6下會(huì)比IE7下更為糟糕,接下來(lái)將介紹解決方法,需要的朋友可以參考下2012-12-12window.requestAnimationFrame是什么意思,怎么用
window.requestAnimationFrame 告訴瀏覽器您要執(zhí)行的動(dòng)畫并且請(qǐng)求瀏覽器的在下一個(gè)動(dòng)畫幀重繪窗口,方法在瀏覽器重繪之前作為一個(gè)回調(diào)函數(shù)被調(diào)用,就是告訴瀏覽器在刷新屏幕的時(shí)候,調(diào)用這個(gè)方法2013-01-01詳解Node.js模塊間共享數(shù)據(jù)庫(kù)連接的方法
我們可以寫一個(gè)統(tǒng)一的數(shù)據(jù)庫(kù)連接模塊來(lái)供本地Node環(huán)境下各模塊間共享使用,接下來(lái)就來(lái)詳解Node.js模塊間共享數(shù)據(jù)庫(kù)連接的方法2016-05-05