2013-05-26 56 views
0

看着下面的jQuery的代碼:jQuery的事件處理程序關閉VS上下文

$button.on("click", {context: "externalRef1"}, function(e){ if (e.data.context){...} }); 

我不知道,當我應該將數據傳遞到處理程序的情況下(按照上面的示例),爲什麼我不能總是依賴關閉(從不知道相互衝突的名字 - 這真的不是問題)?

一些澄清 - 閉包是關於允許該代碼使用外部瓦爾,即

var foo = function(){ 

    var externalRef = "a1"; 

    var call = function(){}{ 
     alert(externalRef); // a1 
    }  
}; 

如果這是總是這樣,爲什麼你需要傳遞數據的方式指出了上面?

+0

我不知道我理解你的問題...這個代碼來自哪裏?我們需要一些背景知道你爲什麼使用這個'context'值? – Matt

+0

我使用外部值cos我需要從事件處理程序以外的其他作用域訪問某些內容。 – user1514042

+1

不同的情況需要不同的技術。閉包變量只能直接訪問該範圍內的函數,而作爲事件數據提供的對象可以自由傳遞和共享。在每個給定的時間使用有意義的東西。 – 2013-05-26 23:10:39

回答

2

這實際上是一個品味問題。對我而言,封閉是傳遞數據更明確和「自然」的方式。然而,在某些情況下event.data僅僅是更方便,例如循環:

// doesn't do what you want! 
for(var i = 0; i < 5; i++) 
    $("#button" + i).on("click", function(e) { alert("Button " + i + " clicked") }); 

// works just fine 
for(var i = 0; i < 4; i++) 
    $("#button" + i).on("click", {i: i}, function(e) { alert("Button " + e.data.i + " clicked") }); 

另一個用例是作爲對多個對象的事件處理程序的單一功能:

$("#add_button").on("click", {action: "+"}, calculatorButtonClicked); 
$("#mul_button").on("click", {action: "*"}, calculatorButtonClicked); 
$("#div_button").on("click", {action: "/"}, calculatorButtonClicked); 

function calculatorButtonClicked(e) { 

    ...lots of common code 

    switch(e.data.action) { 
     case '+': result = x + y; 
     case '*': result = x * y; 
      etc 
    } 

    ...lots of common code 

} 
+0

循環確實是最好的... – user1514042

+0

你可以在JS中克隆一個值 - 理論上可以解決問題,不是嗎? – user1514042

+0

@ user1514042:爲每個迭代創建一個值的副本是您使用閉包的內容。 – Guffa

1

您始終可以使用閉包,始終上下文或始終使用其他解決方案,或者爲任何情況選擇任何解決方案。兩者都不是錯的。

您可以使用最適合每種情況的那一種,或者您最有信心的那種。

+0

我實際遇到了一個案件,當關閉不起作用,我正在尋找它的一個普遍原因。簡而言之,閉包不會將作爲參數傳遞給更高範圍的變量進行緩存。 – user1514042

+0

@ user1514042:我看不出爲什麼閉包不起作用的原因。如果您正在討論thg435顯示的示例,則閉合不起作用,因爲根本沒有閉合。如果你真的使用close,它就可以工作。 – Guffa

相關問題