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

问题描述 投票:0回答:3

我经常看到这样的表达方式:

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

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

function() {
...
}

后面的 () 是什么?为什么要把它放在括起来的 () 中?

谢谢

javascript
3个回答
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;
       ...
   }();

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


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 采用一个不带参数的函数。因此,如何向该函数传递值的问题可以通过创建一个采用 1 个参数的函数来回答,该函数返回一个采用 0 个参数的函数。

我建议任何想要更多地了解此表示法的强大功能的人都可以在 Firebug JavaScript 控制台中使用它。一旦您理解了这个概念,您就会开始看到可以使用这个强大概念的领域。


0
投票

这是一个老问题,但我的构建需要一段时间,我想我可以提供更好的答案:

简短回答

()
运行您刚刚创建的函数。

功能

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

正如您提到的,这是一个常规的匿名函数

立即调用函数表达式

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

这个:

  • 像上面一样创建一个匿名函数
  • 运行函数
    ...()

这类似于创建一个数组,然后在其上运行一个方法

['one', 'two'].split()
你正在定义一些东西,然后用你刚刚定义的东西做一些事情。

为什么要在 2024 年使用 IIFE?

您可能会看到旧的代码库使用 IIFE 创建异步作用域来运行异步/等待代码,但没有理由再这样做了。 您现在可以在所有受支持的node.js 版本中使用顶级await 。所以你只需在 JS 文件中

await promises.readFile()
就可以了。

© www.soinside.com 2019 - 2024. All rights reserved.