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

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

在这:

//Bunch of code...

当前回答

可能是范围隔离。这样函数声明中的变量就不会污染外部命名空间。

当然,在一半的JS实现中,它们都是如此。

其他回答

命名空间。JavaScript的作用域是函数级的。

看起来这个问题已经有了答案,但我还是会发表我的意见。

我知道什么时候我喜欢使用自动执行函数。

var myObject = {
    childObject: new function(){
        // bunch of code
    },
    objVar1: <value>,
    objVar2: <value>
}

该函数允许我使用一些额外的代码来定义childObjects的属性和属性,以获得更清晰的代码,例如设置常用的变量或执行数学方程;哦!或者错误检查。而不是局限于嵌套的对象实例化语法…

object: {
    childObject: {
        childObject: {<value>, <value>, <value>}
    }, 
    objVar1: <value>,
    objVar2: <value>
}

一般来说,编码有很多晦涩的方法来做很多相同的事情,这让你想知道,“为什么要麻烦呢?”但是新的情况不断出现,您不能再仅仅依赖基本/核心原则。

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

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…

一个区别是,你在函数中声明的变量是局部的,所以当你退出函数时,它们就消失了,并且它们不会与其他或相同代码中的其他变量冲突。

我已经看了所有的答案,这里少了一些很重要的东西,我要KISS。有两个主要原因,为什么我需要自执行匿名函数,或者更好地说“立即调用函数表达式(IIFE)”:

更好的命名空间管理(避免命名空间污染-> JS模块) 闭包(模拟私有类成员,如OOP所示)

第一个已经解释得很好了。对于第二个问题,请学习下面的例子:

var MyClosureObject = (function (){
  var MyName = 'Michael Jackson RIP';
  return {
    getMyName: function () { return MyName;},
    setMyName: function (name) { MyName = name}
  }
}());

注意1:我们不是将函数赋值给MyClosureObject,而是调用该函数的结果。注意最后一行中的()。

注意2:关于Javascript中的函数,你还需要知道的是,内部函数可以访问函数的参数和变量,它们是在函数内部定义的。

让我们做一些实验:

我可以得到MyName使用getMyName,它工作:

 console.log(MyClosureObject.getMyName()); 
 // Michael Jackson RIP

下面这种简单的方法是行不通的:

console.log(MyClosureObject.MyName); 
// undefined

但我可以设置另一个名称,并获得预期的结果:

MyClosureObject.setMyName('George Michael RIP');
console.log(MyClosureObject.getMyName()); 
// George Michael RIP

编辑:在上面的例子中,MyClosureObject被设计为不使用newprefix,因此按照惯例它不应该大写。