簡單實現(xiàn)節(jié)流函數(shù)和防抖函數(shù)過程解析
在日常開發(fā)中有很多場景我們都需要用到節(jié)流函數(shù)和防抖函數(shù),比如:實現(xiàn)輸入框的模糊查詢因為需要輪詢ajax,影響瀏覽器性能,所以需要用到節(jié)流函數(shù);實現(xiàn)手機(jī)號、姓名之類的的驗證,往往我們只需要驗證一次,這個時候我們就需要用到防抖函數(shù);但是網(wǎng)上的很多資料都是不夠具體和便于理解。今天自己翻閱了一些資料之后,來簡單的談?wù)勎覍?jié)流函數(shù)和防抖函數(shù)的理解,希望能幫助大家理解;
節(jié)流函數(shù)
顧名思義,就是節(jié)省流量節(jié)省內(nèi)存性能的一種函數(shù),可以理解為是一種性能優(yōu)化方案;
舉個例子:一個水龍頭一直在滴水,可能一次性會滴很多水,但是我們想控制它的頻率 ,讓它每1000毫秒滴一滴水,這個時候我們就可以用到節(jié)流函數(shù)來進(jìn)行控制(簡單可以理解為類似于周期性定時器)
js代碼(可直接復(fù)制到編輯器上看效果):
//首先定義一個全局變量 var canRun = true; //當(dāng)瀏覽器窗口大小發(fā)生變化也就是重新計算窗口大小的時候觸發(fā) window.onresize = function(){ // 取反,canRun為false的情況下 if(!canRun){ //直接return,后面的代碼不執(zhí)行 return } //走到這來就是canRun為true的情況,然后進(jìn)行賦值為false canRun = false //設(shè)置一個定時器進(jìn)行輪詢操作 setTimeout( function () { //這是要做的事情 console.log("函數(shù)節(jié)流") //最后記得重新賦值true繼續(xù)讓他取反 canRun = true //每隔1000毫秒也就是1秒鐘就執(zhí)行一次 }, 1000) }
效果圖如下:
防抖函數(shù)
防抖函數(shù)和節(jié)流函數(shù)很類似,但是稍有區(qū)別,防抖函數(shù)的定義是當(dāng)事件觸發(fā)完成之后再延遲觸發(fā),并且只觸發(fā)一次;如果在觸發(fā)完成之前再次觸發(fā),則會再次刷新延遲;簡單理解為(如果事件不觸發(fā)即不執(zhí)行,并且只會執(zhí)行一次,就是定時器最后走的那一次)
舉個例子:假如有個彈簧,你一直往下按壓只要你不松手就是不會彈出的,彈簧只有在你松手的那一瞬間才會彈出去;防抖函數(shù)也是如此,只要事情觸發(fā)沒有結(jié)束是不會執(zhí)行的,只有在事件觸發(fā)結(jié)束后延遲執(zhí)行一次;
js代碼(可直接復(fù)制到編輯器上看效果):
//定義方法即要做的事情 function fun(){ console.log('onresize') } //定義事件觸發(fā)要執(zhí)行的方法,兩個參數(shù)分別是傳入的要做的事情和定時器的毫秒數(shù) function debounce(fn,delay){ //定義一個變量作為等會清除對象 var handle; //這里用到了閉包,一個函數(shù)里面return另一個函數(shù),變量相互簽引導(dǎo)致垃圾回收機(jī)制不會銷毀handle變量 return function(){ //在這里一定要清除前面的定時器,然后創(chuàng)建一個新的定時器 clearTimeout(handle) //最后這個定時器只會執(zhí)行一次也就是事件觸發(fā)完成之后延遲500毫秒再觸發(fā)(這里的變量賦值是跟定時器建立連接,進(jìn)行地址賦值,一定要重新賦值給handle handle=setTimeout(function(){ fn() },delay) } } //給瀏覽器添加監(jiān)聽事件resize window.addEventListener('resize', debounce(fun, 500));
效果圖如下:
總結(jié):
1.防抖函數(shù)和節(jié)流函數(shù)都是用來提升性能優(yōu)化及用戶體驗的一種方案;
2.防抖函數(shù)只會執(zhí)行一次,且是最后觸發(fā)的那一次,而節(jié)流函數(shù)會規(guī)律性的執(zhí)行多次;
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- 淺談JavaScript節(jié)流和防抖函數(shù)
- 淺析JavaScript 函數(shù)防抖和節(jié)流
- Vue中函數(shù)防抖節(jié)流的理解及應(yīng)用實現(xiàn)
- js防抖函數(shù)和節(jié)流函數(shù)使用場景和實現(xiàn)區(qū)別示例分析
- 一文看懂如何簡單實現(xiàn)節(jié)流函數(shù)和防抖函數(shù)
- 如何解決js函數(shù)防抖、節(jié)流出現(xiàn)的問題
- 淺談VUE防抖與節(jié)流的最佳解決方案(函數(shù)式組件)
- JS函數(shù)節(jié)流和防抖之間的區(qū)分和實現(xiàn)詳解
- JS函數(shù)節(jié)流和函數(shù)防抖問題分析
- 如何在面試中手寫出javascript節(jié)流和防抖函數(shù)
相關(guān)文章
JavaScript JSON.stringify()的使用總結(jié)
JSON是一種輕量級數(shù)據(jù)格式,可以方便地表示復(fù)雜數(shù)據(jù)結(jié)構(gòu)。JSON對象有兩個方法:stringify()和parse()。在簡單的情況下,這兩個方法分別可以將JavaScript序列化為JSON字符串,以及將JSON解析為原生JavaScript值。本文著重介紹JSON.stringify()的使用方法和注意事項。2021-05-05JavaScript實現(xiàn)的XML與JSON互轉(zhuǎn)功能詳解
這篇文章主要介紹了JavaScript實現(xiàn)的XML與JSON互轉(zhuǎn)功能,結(jié)合實例形式分析了基于javascript的xml與json相關(guān)轉(zhuǎn)換功能實現(xiàn)技巧,需要的朋友可以參考下2017-02-02封裝了一個支持匿名函數(shù)的Javascript事件監(jiān)聽器
這篇文章主要介紹了支持匿名函數(shù)的Javascript事件監(jiān)聽封裝,需要的朋友可以參考下2014-06-06淺析JS中對函數(shù)function的理解(基礎(chǔ)篇)
我們知道,在js中,函數(shù)實際上是一個對象,每個函數(shù)都是Function類型的實例,并且都與其他引用類型一樣具有屬性和方法。下面給大家談下對JS中函數(shù)function的理解,一起看看吧2016-10-10JavaScript學(xué)習(xí)筆記整理之引用類型
引用類型是JavaScript中很重要的內(nèi)容,通過本文給大家介紹JavaScript學(xué)習(xí)筆記整理之引用類型,對js引用類型相關(guān)知識感興趣的朋友一起學(xué)習(xí)吧2016-01-01