js如何降低事件處理函式的執行頻率
本章節介紹一下如何給瀏覽器減輕一下負擔。
大家知道我們可以給事件註冊事件處理函式,比如為一個按鈕註冊一個click事件處理函式。
點選此按鈕就會執行函式,當然這通常不會給瀏覽器帶來什麼壓力。
但是也有例外的情況,比如為window註冊resize事件處理函式,如果頻繁快速的調整視窗的尺寸,這將給瀏覽器帶來巨大的壓力,因為沒調整一下視窗尺寸,那麼頁面的元素尺寸等等資料都要被瀏覽器重新計算渲染。
下面就通過程式碼例項介紹一下如何給瀏覽器減輕一下負擔。
更多內容可以參閱函式節流throttle和debounce程式碼演示一章節。
程式碼例項如下:
[JavaScript] 純文字檢視 複製程式碼var updateLayou =_.debounce(function(e){ //code }, 500); window.addEventListener("keydown", updateLayout, false); _.debounce = function(func, wait, immediate) { var timeout; return function() { var context = this, args = arguments; var later = function() { timeout = null; if (!immediate) func.apply(context, args); }; var callNow = immediate && !timeout; clearTimeout(timeout); timeout = setTimeout(later, wait); if (callNow) func.apply(context, args); }; };
上面的程式碼的核心其實取自underscore.js,此js庫中有兩種方式的函式節流,分別是throttle和debounce,本章節只分析一下debounce的實現原理,跟多內容可以參閱js的函式節流和throttle和debounce詳解一章節。
上面的程式碼可以針對比如連續多次按鍵或者按住按鍵不放的情況,下面對程式碼進行一下分析。
一.程式碼註釋:
1._.debounce = function(func, wait, immediate) {},此函式可以返回一個函式,將此返回的函式作為事件處理函式會實現函式節流效果。func引數規定原始的事件處理函式,第二個引數規定延遲執行的時間,用毫秒作為單位,第三個引數規定第一次事件處理函式執行是否延遲,是個布林值,如果為true表示不延遲,如果為false表示延遲。
2.var timeout,宣告一個變數用來儲存定時器函式的返回值。
3.return function(){},返回一個函式物件,此函式被當做時間處理函式以後會具有節流功能。
4.var context = this, args = arguments,將this引用賦值給變數context,將arguments物件賦值給變數args。
5.var later = function() {
timeout = null;
if (!immediate) func.apply(context, args);
},此函式是要延遲執行時,定時器函式呼叫的函式。
timeout = null,設定此值為null,這個很重要,當immediate引數為true的時候,可以用來說明兩次事件處理函式呼叫的間隔是否超過了指定的延遲時間,設定為null說明定時器函式執行了,已經超過了延遲時間。
if (!immediate) func.apply(context, args),如果不是立即執行,那麼就呼叫func函式。
6.var callNow = immediate && !timeout,用來獲取一個標識,用來表示是否一開始可以立馬執行或者是否超過指定的延遲間隔,可以進行下一次的執行了。
7.clearTimeout(timeout),停止定時器函式的執行,如果連續處罰事件的事件間隔在延遲時間之內,那麼將不會得到執行。
8.timeout = setTimeout(later, wait),一個定時器函式的使用。
9.if (callNow) func.apply(context, args),根據條件判斷是否執行func函式。
二.相關閱讀:
1.addEventListener()方法可以參閱addEventListener()和attachEvent()函式的用法一章節。
2.apply()方法可以參閱javascript apply()一章節。
3.setTimeout()方法可以參閱setTimeout()一章節。
相關文章
- js如何批量註冊事件處理函式JS事件函式
- 公共事件處理函式js庫事件函式JS
- 如何給js的onclick事件處理函式傳遞引數JS事件函式
- js刪除註冊的事件處理函式JS事件函式
- 解決jQuery多個事件處理函式執行的現象jQuery事件函式
- js如何給繫結的事件處理函式傳遞引數JS事件函式
- javascript如何移除註冊的事件處理函式JavaScript事件函式
- jQuery如何解綁註冊的事件處理函式jQuery事件函式
- 如何為新增的元素註冊事件處理函式事件函式
- JavaScript 註冊事件處理函式JavaScript事件函式
- js為按鈕註冊點選事件處理函式JS事件函式
- js批量註冊事件處理函式程式碼例項JS事件函式
- javascript如何給事件處理函式傳遞引數JavaScript事件函式
- 事件處理函式中, e.stopPropagation()能放在 onChangeColor()後邊執行嗎?事件函式
- js為物件註冊多個事件處理函式程式碼JS物件事件函式
- JavaScript 批量註冊事件處理函式JavaScript事件函式
- Vue中使用MouseMove事件 獲取滑鼠座標頻率降低或事件卡頓Vue事件
- JS事件處理JS事件
- for迴圈批量註冊事件處理函式事件函式
- JavaScript 事件處理函式傳遞引數JavaScript事件函式
- onclick事件處理函式傳遞引數事件函式
- js立即執行函式原理JS函式
- js 匿名自執行函式JS函式
- 鉤子函式的執行機理函式
- onerror事件處理函式返回false或者true的作用Error事件函式False
- js函式執行過程的探究JS函式
- win10如何檢視記憶體執行頻率_win10檢視記憶體執行頻率的方法Win10記憶體
- JavaScript為事件處理函式傳遞引數JavaScript事件函式
- attachEvent()註冊事件處理函式this指向問題事件函式
- jquery註冊事件處理函式常用的幾種方式jQuery事件函式
- js解惑-函式執行順序JS函式
- Laravel 佇列執行頻率限制Laravel佇列
- 使用頻率比較高的PHP函式方法PHP函式
- js 立即執行函式表示式介紹JS函式
- javascript如何終止函式的執行JavaScript函式
- javascript事件處理函式繫結簡單介紹JavaScript事件函式
- js匿名函式和具名函式執行效率比較JS函式
- 在Linux中用軟體降低CPU的頻率Linux