【发布时间】:2011-10-15 18:33:54
【问题描述】:
我想知道为什么函数末尾有双括号?
这里是简单的匿名函数:
(function(){ ... })();
(function(){ ... })();
这些是干什么用的?
【问题讨论】:
-
是调用运算符。
标签: javascript
我想知道为什么函数末尾有双括号?
这里是简单的匿名函数:
(function(){ ... })();
(function(){ ... })();
这些是干什么用的?
【问题讨论】:
标签: javascript
这声明了一个匿名函数并在同一行立即调用它。把它想象成:
foo();
其中foo 表示一个匿名函数,它被声明为内联并且不能被名称引用。
【讨论】:
这是一个自执行函数。这意味着它会立即执行。
function anon() {
alert('called');
}
anon(); // alerts at this time
(function () {
alert('called');
})(); // alerts at this time, calls itself
【讨论】:
您的代码示例
(function(){ ... })();
可以改写为
anonymous = function () { ... };
(anonymous)();
或者,避免冗余第一个大括号对,如
anonymous = function () { ... };
anonymous();
以将名称引入(此处为全局)名称空间为代价。
正如前面 pst 所指出的,这个构造是用来创建一个新的作用域的。它与闭包结合使用最有用,例如实现无处不在的计数器:
var counter = function (initval) {
var c = initval || 0;
return function () {
var r = c;
c += 1;
return r;
};
} (5);
counter () ; // 5
counter () ; // 6
counter () ; // 7
【讨论】:
function e(){} // function statement, parsed before runtime, can't be anonymous
var e = function (){}; // function expression, parsed at runtime
(function(){}()}); // function expression (evaluated at runtime by the enclosing "()")
所以,为了调用它,只需调用上述表达式的结果,瞧!你给自己一个匿名的自执行函数。
【讨论】:
它声明并调用/执行函数。
function foo (){ ... }
如果你只是拥有它,它不会做任何事情。为了调用foo,您需要参数列表(尽管为空)。所以foo() 会执行。
同样的事情也适用于匿名函数。但是,如果你有一个匿名函数,比如function (){ ... },你怎么称呼它?您没有指向它的变量。没有结尾 () 它只是一个定义,而不是一个调用,所以你必须在最后添加括号,只有你不能做 function (){ ... }() 因为操作顺序和 JavaScript 的解释方式。因此,您还需要将定义括在其自己的括号 (function (){...}) 中。通过调用,它看起来就像您发布的 (function (){...})()。
请注意,您也可以类似地定义函数,例如:
var foo = function (){...};
本质上是创建一个匿名函数并将其分配给一个变量。然后,您可以像使用任何其他功能一样执行foo()。
【讨论】:
在expression (...) 形式中,() 是函数应用运算符。它接受左边的表达式,它必须是一个函数对象并调用它,传入提供的参数,如果有的话。 (() 的另一种用法是优先级,其中包括(expression-that-evaluates-to-a-function-object)。)
“诀窍”是理解这适用于 any 表达式,其计算结果为 function-object 并且函数名仅计算为 function -它代表的对象。这是一个演示:
function f1 () { return 1 }
typeof f1 // function
f1() // 1
var f1b = f1 // f1 evaluates to a function-object which is assigned to f1b
f1b() // 1
var f2 = function () { return 2 }
typeof f2 // function
(((f2))()) // 2 -- only one of the sets is the application operator
typeof (function () {}) // function
(function () { return 3 })() // 3 -- any function-object can be applied
编码愉快。
使用自调用匿名函数的一个原因是“创建一个新范围”。 JavaScript 中的新作用域仅由新函数引入。
【讨论】: