我经常看到如下表达式:
(function () {
var x = 1;
...
}());
我该如何解读?从语法上讲,这就是一个匿名函数定义。
function() {
...
}
那之后的()是什么?为什么把它放在封闭的()?
由于
答案 0 :(得分:24)
完全相同,只是在转换为函数表达式后立即调用它。
// v-----first set of parentheses makes the function an expression
(function () {
var x = 1;
...
}());
// ^-----this set is used to invoke the function
就像你做的那样:
var myfunc = function () {
var x = 1;
...
};
myfunc();
或(类似)这个:
var returnValue = function () {
var x = 1;
...
}();
摆脱名字,移动括号,你可以看到它们并没有那么不同。
答案 1 :(得分:2)
我最常发现这个有用的区域是回调函数。这种表示法也可用于需要在回调函数中包含变量的情况,但是您需要变量状态不受函数外部的影响。
var someVal = 1;
setTimeout( (function(one) {
return function() {
alert(one); // alerts a 1 even 10 seconds after someVal++;
}
})(someVal), 10000);
someVal++; // the value in the setTimeout will remain the same as it is locked inside.
在此上下文中,setTimeout采用不带参数的函数。因此,如何将值传递给该函数的问题通过创建一个函数来回答,该函数接受一个返回带有0个参数的函数的参数。
我建议有人想要了解更多关于这种符号的强大功能,以便在Firebug JavaScript控制台中使用它。一旦你了解了这个概念,你就会开始看到可以使用这个强大概念的领域。