解讀防抖和節(jié)流

underscore.js js實(shí)用庫(kù)

CDN鏈接
https://cdn.bootcss.com/underscore.js/1.9.1/underscore.js
underscore.js中文文檔
官方中文文檔
根據(jù)underscore.js庫(kù)分析學(xué)習(xí)高質(zhì)量的防抖節(jié)流函數(shù)源碼。

防抖

注意:由于對(duì)知識(shí)的加深理解與學(xué)習(xí),本人又重新更新了本文章

事件響應(yīng)函數(shù)在一段事件后才執(zhí)行,如果在這段時(shí)間內(nèi)再次調(diào)用,則重新計(jì)算執(zhí)行時(shí)間;當(dāng)預(yù)定的時(shí)間內(nèi)沒有再次調(diào)用該函數(shù),則執(zhí)行事件響應(yīng)函數(shù)(自我理解:在停止觸發(fā)一定時(shí)間后在執(zhí)行邏輯代碼)

應(yīng)用場(chǎng)景

  1. scroll事件滾動(dòng)觸發(fā)
  2. 搜索框輸入查詢
  3. 表單驗(yàn)證(表單信息輸入完才驗(yàn)證)
  4. 按鈕提交事件
  5. 瀏覽器窗口縮放,resize事件

第一版本

這些代碼做基本的防抖是沒問題的。


image.png

但為了使代碼更加強(qiáng)壯??,需要在第二版本解決兩個(gè)問題:1、執(zhí)行函數(shù)中this默認(rèn)指向window問題;2、執(zhí)行函數(shù)中事件對(duì)象event默認(rèn)指向?yàn)閡ndefined問題


image.png

第二版本

image.png

image.png

第三版本 傳入第三個(gè)參數(shù)(該參數(shù)為布爾值,默認(rèn)不傳為false)實(shí)現(xiàn)鼠標(biāo)移入立即執(zhí)行需求

image.png

第三版本 防抖函數(shù)中的返回值和取消防抖操作

image.png

節(jié)流(更新中。。。)

原理:如果你持續(xù)觸發(fā)事件,每隔一段時(shí)間,只執(zhí)行一次事件(自我理解:不斷觸發(fā)期間只在一定時(shí)間間隔才會(huì)執(zhí)行邏輯代碼)

應(yīng)用場(chǎng)景

1.DOM元素的拖拽功能實(shí)現(xiàn)

  1. 射擊游戲
  2. 計(jì)算鼠標(biāo)移動(dòng)的距離
  3. 監(jiān)聽scroll滾動(dòng)事件

第一版本 利用時(shí)間戳簡(jiǎn)單實(shí)現(xiàn)一版(鼠標(biāo)首次滑動(dòng)觸發(fā),結(jié)束不會(huì)被調(diào)用觸發(fā)函數(shù))

image.png

第二版本 利用定時(shí)器實(shí)現(xiàn)--鼠標(biāo)進(jìn)入第一次不會(huì)觸發(fā),鼠標(biāo)離開最后一次會(huì)觸發(fā)

image.png

第三版 結(jié)合頭兩版本實(shí)現(xiàn) 第一次會(huì)觸發(fā),最后一次也會(huì)觸發(fā)

image.png

第四版本 傳入第三個(gè)參數(shù)來(lái)控制3種情況下代碼的執(zhí)行結(jié)果

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容