很多大多數正確的解釋在這裏,但我非常驚訝,沒有人拋出這裏的關鍵概念:關閉。
基本上發生了什麼是當你聲明你的兩個函數,他們聲明的範圍形式爲關閉。這意味着該閉包內的變量仍然可用於函數。換句話說:
$(document).ready(function(){
// this begins a closure
var msg ="hi";
// you are simply declaring a function here, not calling it
$("#test1").click(function(){alert(msg)});
msg ="hello";
// ditto
$("#test2").click(function(){alert(msg)});
// the end of the closure...msg has the value "hello"
});
然後過了一段時間,點擊事件被調用。附加到click事件的函數仍然可以訪問閉包(其中msg
的值爲「hello」)。
在閉包中「捕獲」變量值的傳統方法是創建一個"Immediately Invoked Function Expression" (IIFE)。基本上你可以認爲這是創建一個全新的閉包,它包含變量的直接值。你可以重新編寫代碼,使用IIFEs這樣的:
$(document).ready(function(){
// this begins a closure
var msg ="hi";
// the following creates an anonymous function with a single parameter
// AND invokes it immediately, creating another closure in which the
// value of msg1 is "hi".
(function(msg1){
$("#test1").click(function(){alert(msg1)});
})(msg);
msg ="hello";
// ditto
(function(msg2){
$("#test2").click(function(){alert(msg2)});
})(msg);
});
我希望這使得它有點更清楚發生了什麼,以及如何讓你在找什麼。
您已改寫了'msg' VAR .. –