2010-07-03 71 views
0

我有一個這樣的代碼,我試圖給某個按鈕添加一個事件處理程序。我想用全局變量&存儲它的當前值回調關閉&不是它的參考。JavaScript中的閉包

var globalNum="dummy"; 
function A() 
{ 
    $("#button").click(function() 
    { 
    $("#button").append(globalNum); 
    }); 
} 

globalNum="dummyAgain"; 

現在,如果單擊事件被解僱,將會添加什麼 - 「dummy」或「dummyAgain」? 我相信這將是「dummyAgain」因爲關閉全局變量的引用被存儲。我想要綁定的價值。 我知道我可以在A中創建一個局部變量,我可以使用全局變量&進行初始化,但是還有其他更酷的方法嗎?

感謝

回答

7

你是對的,它會追加dummyAgain。您可以通過使用bind()處理這個和發送一些事件數據:

var globalNum="dummy"; 
(function A() 
{ 
    $("#button").bind('click', {localNum: globalNum}, function(e) 
    { 
    $("#button").append(e.data.localNum); 
    }); 
})(); 

globalNum="dummyAgain"; 

注意,我立即執行功能A,因此點擊處理程序獲取前附globalNum變化值。正如@Andrew在他的評論中指出的,這與根本不使用「包裝」功能A的效果相同。


而不bind相同的解決方案:

(function() 
{ 
    var localNum = globalNum; 
    $("#button").click(function() 
    { 
    $("#button").append(localNum); 
    }); 
})(); 

這裏匿名功能是捕獲的當前值globalNum在本地變量是有用的。


更新:

爲了完整起見(我希望,@Andrew,你不介意的話,我把它放在這裏)。最「酷」的辦法大概是立即使用參數的功能和執行功能,這個參數:

var globalNum="dummy"; 

(function(globalNum) 
{ 
    $("#button").click(function() 
    { 
    $("#button").append(globalNum); 
    }); 
})(globalNum); 

globalNum="dummyAgain"; 

的「絕招」是參數的名稱和全局變量的名稱是相同。

這也經常用於指代具有較短標識符的一些對象而不污染全局名稱空間,例如,使用jQuery:

(function($) { 
    // jQuery == $ 
})(jQuery) 
+1

+1答案。應該指出,@Felix_Kling使用'bind()',而且在更新'globalNum'之前調用'A()'。這與刪除'A()'函數包裝並直接執行內容是等價的。 – Andrew 2010-07-03 07:36:20

+0

謝謝。 但我不想創建本地數據 - 至少顯式。否則,我可以簡單地在A的body中定義localNum = globalNum,並在回調函數關閉中添加localNum。 不是說創建本地數據有一些問題,我只是在尋找更酷的東西:) – 2010-07-03 07:41:24

+3

然後用@Felix Kling的答案做一個小改動。將'function A()'改爲'function A(globalParam)',並在最後用'})(globalParam)調用它;'請注意函數內部的'globalParam'與外部'globalParam'不同。 – Andrew 2010-07-03 07:47:00

0

也許有一些更酷的方式,但聲明中的局部變量是最簡單和直接的方式,因此是最好的。