我读了一些关于闭包的帖子,到处都看到了这个,但是没有明确的解释它是如何工作的——每次我都被告知要使用它…:
// 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(){ alert("plop"); }
2;
所以我们必须将它们存储在一个变量中才能使用它们,就像任何其他值一样:
var f = function(){ alert("plop"); }
var n = 2;
你也可以使用synatic sugar将函数绑定到一个变量:
function f(){ alert("plop"); }
var n = 2;
但是如果不需要命名它们,并且会导致更多的混乱和更低的可读性,那么您可以立即使用它们。
(function(){ alert("plop"); })(); // will display "plop"
alert(2 + 3); // will display 5
在这里,我的函数和数字没有绑定到一个变量,但它们仍然可以使用。
这样说,看起来自调用函数没有真正的价值。但您必须记住,JavaScript范围分隔符是函数而不是块({})。
因此,自调用函数实际上与c++、c#或Java块具有相同的含义。这意味着在内部创建的变量不会“泄漏”到作用域之外。为了不污染全局作用域,这在JavaScript中非常有用。
这就是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,几乎所有编程语言都是这样工作的。
匿名函数是动态声明的函数
运行时。它们被称为匿名函数,因为它们不是
以与普通函数相同的方式命名。
匿名函数使用函数操作符声明
函数声明的。可以使用函数操作符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/