在javascript中,什么时候你想使用这个:

(function(){
    //Bunch of code...
})();

在这:

//Bunch of code...

当前回答

下面是一个实例,说明了自我调用匿名函数的用处。

for( var i = 0; i < 10; i++ ) {
  setTimeout(function(){
    console.log(i)
  })
}

输出:10,10,10,10…

for( var i = 0; i < 10; i++ ) {
  (function(num){
    setTimeout(function(){
      console.log(num)
    })
  })(i)
}

输出:0,1,2,3,4…

其他回答

这都是关于变量作用域的。默认情况下,在自执行函数中声明的变量仅可用于自执行函数中的代码。这允许编写代码时不考虑变量在其他JavaScript代码块中的命名方式。

例如,正如Alexander在评论中提到的:

(函数(){ Var foo = 3; console.log (foo); }) (); console.log (foo);

这将首先记录3,然后在下一个console.log上抛出一个错误,因为foo没有定义。

下面是一个实例,说明了自我调用匿名函数的用处。

for( var i = 0; i < 10; i++ ) {
  setTimeout(function(){
    console.log(i)
  })
}

输出:10,10,10,10…

for( var i = 0; i < 10; i++ ) {
  (function(num){
    setTimeout(function(){
      console.log(num)
    })
  })(i)
}

输出:0,1,2,3,4…

给你一个简单的问题:“在javascript中,什么时候你想使用这个:…”

我喜欢@ken_browning和@sean_holding的回答,但这里有另一个用例,我没有看到提到:

let red_tree = new Node(10);

(async function () {
    for (let i = 0; i < 1000; i++) {
        await red_tree.insert(i);
    }
})();

console.log('----->red_tree.printInOrder():', red_tree.printInOrder());

在节点。插入是某种异步操作。

我不能只是调用等待没有异步关键字在我的函数的声明,我不需要一个命名函数以后使用,但需要等待插入调用或我需要一些其他更丰富的功能(谁知道?)。

IIRC允许你创建私有属性和方法。

简单的回答是:防止全球(或更高)范围的污染。

IIFE(立即调用函数表达式)是将脚本编写为插件、附加组件、用户脚本或任何期望与其他人的脚本一起工作的脚本的最佳实践。这可以确保您定义的任何变量都不会对其他脚本产生不良影响。

这是另一种写IIFE表达式的方法。我个人更喜欢以下方法:

void function() {
  console.log('boo!');
  // expected output: "boo!"
}();

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/void

从上面的例子可以很清楚地看出,IIFE也会影响效率和性能,因为原本预计只运行一次的函数实际上只执行了一次,然后就永远被丢弃了。这意味着函数或方法声明不会保留在内存中。