这里有很多大部分正确的解释,但令我惊讶的是,没有人在这里抛出关键概念:闭包。
基本上发生的事情是当你声明你的两个函数时,它们声明的范围形成了一个闭包。这意味着该闭包内的变量对函数仍然可用。换句话说:
$(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"
});
然后过了一段时间,点击事件被调用。附加到点击事件的函数仍然可以访问闭包(其中的值为msg
“hello”)。
在闭包中“捕获”变量值的传统方法是创建一个“立即调用函数表达式”(IIFE)。基本上,您可以将其视为创建一个包含变量立即值的全新闭包。您可以像这样重新编写代码以使用 IIFE:
$(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);
});
我希望这能让你更清楚地了解正在发生的事情,以及如何获得你想要的东西。