最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

JavaScript函數(shù)節(jié)流和函數(shù)防抖之間的區(qū)別

 更新時間:2017年02月15日 08:27:36   作者:wall''''''''''''''''s  
本文主要介紹了JavaScript函數(shù)節(jié)流和函數(shù)防抖之間的區(qū)別。具有很好的參考價值,下面跟著小編一起來看下吧

一、概念解釋

函數(shù)節(jié)流和函數(shù)防抖,兩者都是優(yōu)化高頻率執(zhí)行js代碼的一種手段。

大家大概都知道舊款電視機(jī)的工作原理,就是一行行得掃描出色彩到屏幕上,然后組成一張張圖片。由于肉眼只能分辨出一定頻率的變化,當(dāng)高頻率的掃描,人類是感覺不出來的。反而形成一種視覺效果,就是一張圖。就像高速旋轉(zhuǎn)的風(fēng)扇,你看不到扇葉,只看到了一個圓一樣。

同理,可以類推到j(luò)s代碼。在一定時間內(nèi),代碼執(zhí)行的次數(shù)不一定要非常多。達(dá)到一定頻率就足夠了。因為跑得越多,帶來的效果也是一樣。倒不如,把js代碼的執(zhí)行次數(shù)控制在合理的范圍。既能節(jié)省瀏覽器CPU資源,又能讓頁面瀏覽更加順暢,不會因為js的執(zhí)行而發(fā)生卡頓。這就是函數(shù)節(jié)流和函數(shù)防抖要做的事。

函數(shù)節(jié)流是指一定時間內(nèi)js方法只跑一次。比如人的眨眼睛,就是一定時間內(nèi)眨一次。這是函數(shù)節(jié)流最形象的解釋。

函數(shù)防抖是指頻繁觸發(fā)的情況下,只有足夠的空閑時間,才執(zhí)行代碼一次。比如生活中的坐公交,就是一定時間內(nèi),如果有人陸續(xù)刷卡上車,司機(jī)就不會開車。只有別人沒刷卡了,司機(jī)才開車。

二、函數(shù)節(jié)流

函數(shù)節(jié)流應(yīng)用的實(shí)際場景,多數(shù)在監(jiān)聽頁面元素滾動事件的時候會用到。因為滾動事件,是一個高頻觸發(fā)的事件。以下是監(jiān)聽頁面元素滾動的示例代碼:

// 函數(shù)節(jié)流
var canRun = true;
document.getElementById("throttle").onscroll = function(){
 if(!canRun){
 // 判斷是否已空閑,如果在執(zhí)行中,則直接return
 return;
 }
 canRun = false;
 setTimeout(function(){
 console.log("函數(shù)節(jié)流");
 canRun = true;
 }, 300);
};

函數(shù)節(jié)流的要點(diǎn)是,聲明一個變量當(dāng)標(biāo)志位,記錄當(dāng)前代碼是否在執(zhí)行。

如果空閑,則可以正常觸發(fā)方法執(zhí)行。

如果代碼正在執(zhí)行,則取消這次方法執(zhí)行,直接return。

這個方法的作用是監(jiān)聽ID為throttle元素的滾動事件。

當(dāng)canRun為true,則代表現(xiàn)在的滾動處理事件是空閑的,可以使用。

通過關(guān)卡if(!canRun),等于就拿到了通行證。然后下一步的操作就是立馬將關(guān)卡關(guān)上canRun=false。這樣,其他請求執(zhí)行滾動事件的方法,就被擋回去了。

接著用setTimeout規(guī)定最小的時間間隔300,接著再執(zhí)行setTimeout方法體里面的內(nèi)容。

最后,等setTimeout里面的方法都執(zhí)行完畢,才釋放關(guān)卡canRun=true,允許下一個訪問者進(jìn)來。

這個函數(shù)節(jié)流的實(shí)現(xiàn)形式,需要注意的是執(zhí)行的間隔時間是>=300ms。如果具體執(zhí)行的方法是包含callback的,也可以將canRun=true這一步放到callback中。理解了函數(shù)節(jié)流的關(guān)卡設(shè)置重點(diǎn),其實(shí)改起來就簡單多了。

三、函數(shù)防抖

函數(shù)防抖的應(yīng)用場景,最常見的就是用戶注冊時候的手機(jī)號碼驗證和郵箱驗證了。只有等用戶輸入完畢后,前端才需要檢查格式是否正確,如果不正確,再彈出提示語。以下還是以頁面元素滾動監(jiān)聽的例子,來進(jìn)行解析:

// 函數(shù)防抖
var timer = false;
document.getElementById("debounce").onscroll = function(){
 clearTimeout(timer); // 清除未執(zhí)行的代碼,重置回初始化狀態(tài)
 timer = setTimeout(function(){
 console.log("函數(shù)防抖");
 }, 300);
}; 

函數(shù)節(jié)流的要點(diǎn),也是需要一個setTimeout來輔助實(shí)現(xiàn)。延遲執(zhí)行需要跑的代碼。

如果方法多次觸發(fā),則把上次記錄的延遲執(zhí)行代碼用clearTimeout清掉,重新開始。

如果計時完畢,沒有方法進(jìn)來訪問觸發(fā),則執(zhí)行代碼。

這個方法的作用是監(jiān)聽ID為debounce元素的滾動事件

進(jìn)入滾動事件方法體的時候,做的第一件事就是清除上次未執(zhí)行的setTimeout。而setTimeout的引用id由變量timer記錄。

clearTimeout方法,允許傳入無效的值。所以這里直接執(zhí)行clearTimeout即可。

然后,將需要執(zhí)行的代碼放入setTimeout中,再返回setTimeout引用給timer緩存。

如果倒計時300ms以后,還沒有新的方法觸發(fā)滾動事件,則執(zhí)行setTimeout中的代碼。

函數(shù)防抖的實(shí)現(xiàn)重點(diǎn),就是巧用setTimeout做緩存池,而且可以輕易地清除待執(zhí)行的代碼。

其實(shí),用隊列的方式也可以做到這種效果。這里就不深入了。

四、在線demo

這是我寫的一個測試demo,把鼠標(biāo)移動到模塊上方,滾動滾輪,即可在控制臺查看輸出效果。

demo地址:https://wall-wxk.github.io/blogDemo/2017/02/15/throttleAndDebounce.html

以上就是本文的全部內(nèi)容,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,同時也希望多多支持腳本之家!

相關(guān)文章

  • 小程序?qū)崿F(xiàn)簡單吸頂效果

    小程序?qū)崿F(xiàn)簡單吸頂效果

    這篇文章主要為大家詳細(xì)介紹了小程序?qū)崿F(xiàn)簡單吸頂效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • 使用layer.msg 時間設(shè)置不起作用的解決方法

    使用layer.msg 時間設(shè)置不起作用的解決方法

    今天小編就為大家分享一篇使用layer.msg 時間設(shè)置不起作用的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • JS動態(tài)高度虛擬列表實(shí)現(xiàn)原理解析

    JS動態(tài)高度虛擬列表實(shí)現(xiàn)原理解析

    這篇文章將和大家一起探討一下動態(tài)高度虛擬列表原理并指出常見虛擬列表采用累計高度方式存在缺點(diǎn),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • JavaScript實(shí)現(xiàn)篩選數(shù)組

    JavaScript實(shí)現(xiàn)篩選數(shù)組

    這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)篩選數(shù)組,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-03-03
  • 微信小程序switch組件使用詳解

    微信小程序switch組件使用詳解

    這篇文章主要為大家詳細(xì)介紹了微信小程序switch組件的實(shí)現(xiàn)方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 初識Javascript小結(jié)

    初識Javascript小結(jié)

    本文是一個學(xué)習(xí)javascript的新手總結(jié)的一些關(guān)于javascript的方法,有需要的小伙伴可以參考下。
    2015-07-07
  • JS與jQuery遍歷Table所有單元格內(nèi)容的方法

    JS與jQuery遍歷Table所有單元格內(nèi)容的方法

    這篇文章主要介紹了JS與jQuery遍歷Table所有單元格內(nèi)容的方法,結(jié)合實(shí)例形式分別描述了JavaScript與jQuery實(shí)現(xiàn)遍歷table單元格的實(shí)現(xiàn)技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-12-12
  • JavaScript操作CSS的高級用法分享

    JavaScript操作CSS的高級用法分享

    Web開發(fā)中,JavaScript與CSS的結(jié)合用于增強(qiáng)網(wǎng)頁的交互性和用戶體驗,本文將探索幾種高級方法來使用JavaScript操作CSS,并分別通過代碼示例進(jìn)行講解,希望對大家有所幫助
    2023-12-12
  • 淺談JSON.parse()和JSON.stringify()

    淺談JSON.parse()和JSON.stringify()

    本文給大家簡單描述了下JSON.parse()和JSON.stringify()的異同點(diǎn),十分的實(shí)用,有需要的小伙伴可以參考下
    2015-07-07
  • js判斷當(dāng)前頁面在移動設(shè)備還是在PC端中打開

    js判斷當(dāng)前頁面在移動設(shè)備還是在PC端中打開

    這篇文章主要介紹了js判斷當(dāng)前頁面在移動設(shè)備還是在PC端中打開的相關(guān)資料,需要的朋友可以參考下
    2016-01-01

最新評論

青浦区| 蒙自县| 宜章县| 英吉沙县| 通道| 攀枝花市| 玉屏| 石屏县| 喀喇沁旗| 来凤县| 大丰市| 封开县| 安图县| 鸡西市| 宣化县| 云浮市| 襄城县| 上饶市| 上犹县| 鄂州市| 富民县| 陕西省| 南部县| 五原县| 新龙县| 贵溪市| 曲周县| 周至县| 池州市| 广安市| 定南县| 凤冈县| 景东| 广东省| 沽源县| 辉县市| 吉林省| 扶风县| 滕州市| 隆化县| 灵丘县|