2016-11-29 72 views
0

我想在jQuery中將函數引用作爲事件處理函數傳遞。我想在下面的簡單的例子來使用速記像...在jQuery中將函數引用作爲事件處理函數傳遞

$("a").click(console.debug.bind(undefined,this)); 

...而不是傳遞明確整個函數體:

$("a").click(function() { 
    console.debug(this) 
}); 

此外,我想訪問元素在我的速記功能中由jQuery選擇(並將它們作爲參數傳遞)。換句話說:我希望$("a")的結果爲this(或任何其他將檢索結果的代碼)。

到目前爲止,我已經試過:

var a = function() { 
    console.debug(this); 
}; 

var b = console.debug.bind(undefined,this); 

$("a").click(function() {console.debug(this)}); // prints link 
$("a").click(a); // prints link 
b(); // prints Window 
$("a").click(console.debug.bind(undefined,this)); // prints Window & jQuery.Event 

這裏是小提琴: https://jsfiddle.net/hbqw2z93/1/

我的問題是:

  1. 是否有可能使用這樣的建設和滿足所有要求,沒有附加變量的定義 - 只有一行如上所示?
  2. 是否可以使用描述的方法訪問jQuery的選擇結果?
  3. 爲什麼在給定範圍內this成爲'合併'Window和jQuery.Event對象?

回答

1
  • 你已經在使用它了,對不對? :)它是有限的,但它在你自己的小提琴

  • jQuery將傳遞事件對象到您指定的功能。你可以使用函數綁定來傳遞它作爲參數(你已經在你的小提琴中工作)

  • 它沒有。看看發生了什麼:

jQuery passed one argument點擊處理函數 - 事件對象。您將console.debug.bind(undefined, this)作爲處理函數傳遞,以便jQuery用一個參數調用它。

然後,當您將you are asking to use 'undefined'綁定爲函數內部的'this'對象併發送額外參數 - 'this'時,由於您在最高級別綁定,因此這是此範圍內的一個窗口。

因此,當發生實際點擊時,jQuery會調用兩個參數 - 在click()和jQuery事件中始終傳遞給click處理程序的Window對象 - console.debug。 console.debug()可以接受並顯示多個對象,這正是您在開發人員控制檯中看到的內容。

+0

傳遞undefined是相同的,因爲沒有通過。它不會像這樣使用undefined。此外,它只是將窗口傳遞給調試方法,「this」不傳遞給調試。 –

+0

當然'this'通過了 - 這就是他在控制檯中接收兩個對象的原因。和評論關於undefined只是一個語言abracadabra :)因爲函數不會有'this',它肯定會覺得它實際上使用'undefined'作爲'this':)) –

1

bind第一個參數是新的上下文,以用於this。通過傳遞undefined你基本上沒有傳遞第一個參數。

第二個和更多參數作爲第一個值傳遞到函數中。

還要注意this在全局範圍內時,是指window對象。

所以在這裏,b ...

console.debug.bind(undefined,this); 

是相同的......

function(){ console.debug(window); } 

..since你傳遞this(這是window)作爲第一個參數debug

默認情況下,當您將事件的目標元素,this會自動指向一個抓住了事件的元素,所以綁定甚至不應該是必要的,這就是爲什麼$("a").click(a);工作沒有使用綁定。

相關問題