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