2016-08-04 70 views
0

我已經運行到某些性能問題時,一個滾動的事件會得到一個項目我工作的解僱,發現去抖徵稅的東西將是一個可行的解決方案:事件處理程序中的匿名函數內可訪問jQuery事件對象嗎?

jQuery(document).ready(function() { 
    jQuery(window).on('scroll', debounce(function(e) { 
      console.log('debounced'); 
      console.log(e); // will print the corresponding jQuery object 
      // some heavy work 
     }, 250, true) 
    ); 
}); 

function debounce(func, wait, immediate) { 
    var timeout; 
    return function() { 
     var obj = this, args = arguments; 
     if (timeout) clearTimeout(timeout); 
     else if (immediate) func.apply(obj, args); 
     timeout = setTimeout(function() { 
      if (!immediate) func.apply(obj, args); 
      timeout = null; 
     }, wait || 100); 
    }; 
}; 

我的問題是,如何jQuery事件對象是否在debounce()內正確移交? 是不是應該作爲處理函數集的第一個參數傳遞,這裏是debounce()?

這個解決方案似乎可以讓工作順利完成,但是我在這裏錯過了一些概念性的東西嗎?

NB:信用John Hann的去抖動功能

+0

哪裏是'debounceOnce()'? – technophobia

+0

很抱歉編輯過,指的是'debounce()'。起初的意思是因爲debounce被多次處理......這實際上並不是我想要的,所以嘗試了不同的解決方案 - 在這個過程中進行debouceOnce的最終反擊 - 最後想出了直接把debounce作爲事件處理程序。 – decksterr

+0

從參數對象中檢索jQuery事件對象。 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Functions/arguments – Will

回答

1

的回答是,jQuery的事件得到防抖動功能的回報,以換取它,所以它exacly什麼事件要在參數,以獲得具有匿名函數。

var exampleFunc=function(){ 
    return 1; 
}; 

var a = exampleFunc; //a is exampleFunc reference 
a= exampleFunc(); // a is return value of exampleFunc = 1 

一些例子相同的行爲:

$('el').on("click",function(e){ /* do something */ }) 

相同

someFunc=function(){ /* do something */ }; 
$('el').on("click",someFunc); 

是一樣的:

someFunc=function(){ /* do something */ }; 
someFunc2=function(){ /* do something 2 */ return someFunc; }; 

$('el').on("click",someFunc2()); 

和......一樣:

someFunc2=function(){ 
    /* do something 2 */ 
    return function(){ /* do something */ } 
}; 

$('el').on("click",someFunc2()); 

結論 - 在下一個函數中使用函數正在使用它的返回值。

var a=5; 
var getA(){ return 5; }; 

var twentyfive=a*getA(); //25 

使用函數返回另一個函數的一些例子:

//EXAMPLE NESTED FUNCTION 
 
var funcNested=function(){ 
 
    console.log("It is funcNested "); 
 
}; 
 

 
var func=function(){ return funcNested; }; 
 

 
$("#test").on("click",func());
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> 
 
<button id="test">Click me</button>

+0

非常感謝! 我明白,但不知何故努力涉及如何適用於這種情況 – decksterr

相關問題