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

IT技术 javascript
2021-03-12 18:34:15

我经常看到这样的表达:

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

我如何解释它?从语法上讲,这本身就是一个匿名函数定义。

function() {
...
}

之后的 () 是什么?为什么把它放在封闭的()中?

谢谢

2个回答

完全一样,只是它在转换为函数表达式后立即被调用。

// 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;
       ...
   }();

去掉名称,移动括号,您会发现它们并没有什么不同。

@Oliver:函数表达式和声明之间存在一些微妙但重要的区别。这是一篇关于 js 函数的非常棒的文章
2021-04-16 18:34:15
@user113716 好文章!。很明显,括号将函数声明转换为函数表达式,但也值得一提的是:(function(){}())(function(){})()恰好是相同的。第一个就是 Douglas Crockford 的风格。
2021-04-24 18:34:15
嗯,有意思。我想我需要深入研究表达式和函数调用的确切含义,谢谢。
2021-05-02 18:34:15

我最常发现这很有用的领域是回调函数。这种表示法也可以用于需要在回调函数中包含变量的情况,但您需要变量状态不受函数外部发生的事情的影响。

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

我认为您正在寻找的术语是“关闭”。闭包还有其他几种用途,其中许多我还没有机会探索。
2021-04-23 18:34:15
这叫什么?如果它这么热,它肯定有一个名字。
2021-04-25 18:34:15
这就是我的想法.. 但一些快速搜索提取了很多看似无关的信息.. aclosure之间有什么区别clojure,我想知道?
2021-04-25 18:34:15