javascript function vs.(function(){...}());

时间:2011-01-26 15:13:13

标签: javascript

我经常看到如下表达式:

(function () {
    var x = 1;
    ...
}());

我该如何解读?从语法上讲,这就是一个匿名函数定义。

function() {
...
}
那之后的()是什么?为什么把它放在封闭的()?

由于

2 个答案:

答案 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控制台中使用它。一旦你了解了这个概念,你就会开始看到可以使用这个强大概念的领域。