微信小程序之使用函數防抖與函數節流 - 新聞資(zī)訊 - 雲南小程序開發|雲南軟件開發|雲南網站(zhàn)建設-西山區知普網絡科技工作室

159-8711-8523

雲南網建設/小程序開發/軟件開發

知識

不管是網站(zhàn),軟件還是小程序,都要直接或間接能為您産生價值,我們在追求其視覺表現的同時,更側重于功能的便捷,營銷的便利,運營的高效,讓網站(zhàn)成為營銷工具,讓軟件能切實提升企業(yè)内部管理水平和(hé)效率。優秀的程序為後期升級提供便捷的支持!

微信小程序之使用函數防抖與函數節流

發表時間:2021-2-3

發布人:葵宇科技

浏覽次數:57

函數防抖和(hé)函數節流都是老生常談的問(wèn)題了。這兩種方式都能優化 js 的性能。有些人可(kě)能會搞混兩個(gè)的概念。所以,我以自己的理解,來解釋這兩個(gè)概念的含義。并且列舉在小程序中(zhōng)這兩個(gè)方法的使用。


函數防抖: 英文(wén) debounce 有防反跳的意思,大緻就是指防止重複觸發。

那麼,函數防抖,真正的含義是:延遲函數執行即不管debounce函數觸發了多久,隻在最後一次觸發debounce函數時,才定義setTimeout,到達間隔時間再執行 需要防抖的函數。

用處:多用于 input 框 輸入時,顯示匹配的輸入内容的情況。

 

函數節流: 英文(wén) throttle 有節流閥的意思。大緻意思也是 節約觸發的頻率

那麼,函數節流,真正的含義是:單位時間n秒内,第一次觸發函數并執行,以後 n秒内不管觸發多少(shǎo)次,都不執行。直到下(xià)一個(gè)單位時間n秒,第一次觸發函數并執行,這個(gè)n秒内不管函數多少(shǎo)次都不執行

用處:多用于頁面scroll滾動(dòng),或者窗口resize,或者防止按鈕重複點擊等情況

 

其實如(rú)果隻根據 控制函數觸發的頻率是不好區分這兩個(gè)概念的。我認為兩個(gè)函數都能達到防止重複觸發的功能。但是函數防抖是 n秒後延遲執行;而函數節流立馬執行,n秒後再立馬執行。

 

在小程序中(zhōng),函數防抖、函數節流的使用方式:

一般都會把這兩種方法封裝在公用的 js 中(zhōng):

tool.js

複制代碼
/*函數節流*/
function throttle(fn, interval) {
  var enterTime = 0;//觸發的時間
  var gapTime = interval || 300 ;//間隔時間,如(rú)果interval不傳,則默認300ms
  return function() {
    var context = this;
    var backTime = new Date();//第一次函數return即觸發的時間
    if (backTime - enterTime > gapTime) {
      fn.call(context,arguments);
      enterTime = backTime;//賦值給第一次觸發的時間,這樣就保存了第二次觸發的時間
    }
  };
}

/*函數防抖*/
function debounce(fn, interval) {
  var timer;
  var gapTime = interval || 1000;//間隔時間,如(rú)果interval不傳,則默認1000ms
  return function() {
    clearTimeout(timer);
    var context = this;
    var args = arguments;//保存此處的arguments,因為setTimeout是全局的,arguments不是防抖函數需要的。
    timer = setTimeout(function() {
      fn.call(context,args);
    }, gapTime);
  };
}

export default {
  throttle,
  debounce
};
複制代碼

 使用:

複制代碼
import tool from "../../static/js/tool.js";
Page({
   data:{
    win_scrollTop:0
   },
   onPageScroll: tool.throttle(function(msg){
      this.setData({
        win_scrollTop: msg[0].scrollTop
      });
   }),
   gotoUnlock: tool.debounce(function() {
      this.saveUserInfo();
   }),
   saveUserInfo:function(){
      console.log(111)
   }
})
複制代碼

 

上面的兩種方式隻是精簡版的,可(kě)能還有某些情況沒考慮到,以後遇到了再優化。

 

函數節流的說明:

(1) 第一次執行時,是一定能執行函數的。

(2) 然後 n秒内第二次觸發的時候,當第一次與第二次間隔不足 設置的間隔時間時,就不會執行。之後第三、第四次觸發還是不執行。

(3) 直到 n秒之後 有且僅有一次,并且是第一次再次觸發函數。

 

函數防抖的說明:

(1) 第一次觸發函數時,定義了一個(gè)定時器(qì)。在 n秒後執行。

(2) 然後 函數第二次觸發的時候,由于閉包的特性,這時候的 timer已經是第一次觸發時的 定時器(qì)的标識了。然後直接清除第一次的setTimeout,這時候第一次的setTimeout裡面的内容就不會執行了。然後再定義第二次的setTimeout。

(3) 然後重複第二個(gè)步驟,一直清除,又一直設置。直到函數最後一次觸發,定義了最後的一個(gè)定時器(qì),并且間隔 n秒 執行。

(4) 如(rú)果在 最後一個(gè)定時器(qì)沒執行時,函數又觸發了,那麼又重複第三步。相當于 設置的間隔時間,隻是延遲函數執行的時間,而不是間隔多少(shǎo)秒再執行。

 

到這裡,這兩個(gè)方式的區别就很明顯了。函數節流減少(shǎo)函數的觸發頻率,而函數防抖則是延遲函數執行,并且不管觸發多少(shǎo)次都隻執行最後一次

 

相關(guān)案例查看更多