我读了一些关于闭包的帖子,到处都看到了这个,但是没有明确的解释它是如何工作的——每次我都被告知要使用它…:
// Create a new anonymous function, to use as a wrapper
(function(){
// The variable that would, normally, be global
var msg = "Thanks for visiting!";
// Binding a new function to a global object
window.onunload = function(){
// Which uses the 'hidden' variable
alert( msg );
};
// Close off the anonymous function and execute it
})();
好的,我看到我们将创建一个新的匿名函数,然后执行它。所以在这之后,这段简单的代码应该工作了(它确实工作了):
(function (msg){alert(msg)})('SO');
我的问题是这里发生了什么魔法?当我写到:
(function (msg){alert(msg)})
然后将创建一个新的未命名函数,如function ""(msg)…
但为什么这行不通呢?
(function (msg){alert(msg)});
('SO');
为什么要在同一条线上?
你能给我指出一些帖子或者给我一个解释吗?
匿名函数是动态声明的函数
运行时。它们被称为匿名函数,因为它们不是
以与普通函数相同的方式命名。
匿名函数使用函数操作符声明
函数声明的。可以使用函数操作符to
在任何可以放置表达式的地方创建一个新函数。为
例如,您可以将一个新函数声明为参数
函数调用或分配另一个对象的属性。
下面是一个命名函数的典型例子:
function flyToTheMoon() {
alert("Zoom! Zoom! Zoom!");
}
flyToTheMoon();
下面是创建匿名函数的相同示例:
var flyToTheMoon = function() {
alert("Zoom! Zoom! Zoom!");
}
flyToTheMoon();
详情请浏览http://helephant.com/2008/08/23/javascript-anonymous-functions/
这就是JavaScript的工作原理。你可以声明一个命名函数:
function foo(msg){
alert(msg);
}
叫它:
foo("Hi!");
或者,你可以声明一个匿名函数:
var foo = function (msg) {
alert(msg);
}
称之为:
foo("Hi!");
或者,你可以永远不将函数绑定到一个名称:
(function(msg){
alert(msg);
})("Hi!");
函数也可以返回函数:
function make_foo() {
return function(msg){ alert(msg) };
}
(make_foo())("Hi!");
make_foo函数体中任何用“var”定义的变量都将被make_foo返回的每个函数关闭,这是毫无意义的。这是一个闭包,这意味着一个函数对值所做的任何更改都将被另一个函数可见。
这让你可以封装信息,如果你想:
function make_greeter(msg){
return function() { alert(msg) };
}
var hello = make_greeter("Hello!");
hello();
除了Java,几乎所有编程语言都是这样工作的。
你展示的代码,
(function (msg){alert(msg)});
('SO');
由两个语句组成。第一个是一个产生函数对象的表达式(由于没有保存,该函数对象随后将被垃圾收集)。第二个是一个产生字符串的表达式。要将函数应用到字符串,您要么需要在创建函数时将字符串作为参数传递给函数(上面也显示了这一点),要么需要实际将函数存储在变量中,以便稍后在空闲时应用它。像这样:
var f = (function (msg){alert(msg)});
f('SO');
注意,通过在变量中存储匿名函数(lambda函数),您实际上是在给它一个名称。因此你也可以定义一个普通的函数:
function f(msg) {alert(msg)};
f('SO');