JavaScript效能最佳化技巧之函數節流

來源:互聯網
上載者:User

函數節流技術的主要思路是,通過一個定時器,阻斷連續重複的函數調用。對於我們自己內部使用的函數,這通常意義不大,也不推薦使用這個技術,它可能會丟失對某些資料的處理。但是對於在使用者介面調用的函數,卻非常有意義。例如一個 mousemove 或者 IE 中 resize 事件的監聽函數。

這類事件監聽函數往往伴隨著兩個主要特徵:1. 短時間內連續多次重複觸發 ; 2. 大量的 DOM 操作。眾所周知,DOM 操作對記憶體和 CPU 的開銷是比較大的,特別是當同時滿足特徵1時,往往給瀏覽器造成不小的壓力。函數節流技術的意義在於在使用者察覺範圍外,降低函數調用的頻率,從而提升效能。

這個技巧的大概模式如下面這樣:

 
  1. var processor = {  
  2.     timeoutId: null,  
  3.  
  4.     performProcessing: function(){  
  5.             // 要執行的代碼  
  6.     },  
  7.  
  8.     process: function(){  
  9.         clearTimeout(this.timeoutId);  
  10.         this.timeoutId  = setTimeout(function(){  
  11.             processor.performProcessing();  
  12.         }, 100);  
  13.     }  
  14. };  
  15.  
  16. //調用  
  17. processor.process();  
  18. performProcessing 是真正要調用的函數,而程式的入口在 process,每次進入 process,真正要調用的函數
  19.  performProcessing 都會被延遲 100 毫秒執行,如果在此期間,process 再次被調用,則會重設前一次的計時器,
  20. 重新開始計時,這樣保證了 performProcessing 中的代碼至少要間隔 100 毫秒才會被執行一次,原理非常的簡單,
  21. 下面這個函數也是利用這個原理,通過閉包達到了同樣的目的,它接受兩個參數,第一個是要真正要執行的函數,第二個是間隔的時間。  
  22. function throttle(fn, delay) {  
  23.     var timer = null;  
  24.     return function () {  
  25.         var context = this, args = arguments;  
  26.         clearTimeout(timer);  
  27.         timer = setTimeout(function () {  
  28.         fn.apply(context, args);  
  29.     }, delay);  
  30.   };  
  31. }  

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.