我读了一些关于闭包的帖子,到处都看到了这个,但是没有明确的解释它是如何工作的——每次我都被告知要使用它…:
// 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');
为什么要在同一条线上?
你能给我指出一些帖子或者给我一个解释吗?
我感到困惑的一件事是“()”是分组操作符。
这是你声明的基本函数。
例1:
var message = 'SO';
function foo(msg) {
alert(msg);
}
foo(message);
函数是对象,可以分组。我们在函数周围加上括号。
例2:
var message = 'SO';
function foo(msg) { //declares foo
alert(msg);
}
(foo)(message); // calls foo
现在,我们不用声明并立即调用相同的函数,而是可以在调用时使用基本替换来声明它。
例3。
var message = 'SO';
(function foo(msg) {
alert(msg);
})(message); // declares & calls foo
最后,我们不需要额外的foo,因为我们没有使用名称来调用它!函数可以是匿名的。
例4。
var message = 'SO';
(function (msg) { // remove unnecessary reference to foo
alert(msg);
})(message);
要回答您的问题,请参考示例2。第一行声明了一些无名函数并对其进行分组,但不调用它。第二行对字符串进行分组。两者都不做任何事。(文森特的第一个例子。)
(function (msg){alert(msg)});
('SO'); // nothing.
(foo);
(msg); //Still nothing.
But
(foo)
(msg); //works
匿名函数是动态声明的函数
运行时。它们被称为匿名函数,因为它们不是
以与普通函数相同的方式命名。
匿名函数使用函数操作符声明
函数声明的。可以使用函数操作符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/
这个答案与问题没有严格的联系,但是您可能有兴趣发现这种语法特性并不是函数特有的。例如,我们总是可以这样做:
alert(
{foo: "I am foo", bar: "I am bar"}.foo
); // alerts "I am foo"
与函数相关。因为它们是继承自Function的对象。原型,我们可以这样做:
Function.prototype.foo = function () {
return function () {
alert("foo");
};
};
var bar = (function () {}).foo();
bar(); // alerts foo
你知道,我们甚至不需要用圆括号来包围函数来执行它们。不管怎样,只要我们试着把结果赋值给一个变量。
var x = function () {} (); // this function is executed but does nothing
function () {} (); // syntax error
对于函数,一旦声明了它们,就可以对它们调用new操作符并获得一个对象。以下是等价的:
var obj = new function () {
this.foo = "bar";
};
var obj = {
foo : "bar"
};