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

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

在这:

//Bunch of code...

当前回答

是否有一个参数和“一串代码”返回一个函数?

var a = function(x) { return function() { document.write(x); } }(something);

关闭。something的值被赋给a的函数使用。something可以有一些变化的值(for循环),每次a都有一个新函数。

其他回答

我已经看了所有的答案,这里少了一些很重要的东西,我要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,因此按照惯例它不应该大写。

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

是否有一个参数和“一串代码”返回一个函数?

var a = function(x) { return function() { document.write(x); } }(something);

关闭。something的值被赋给a的函数使用。something可以有一些变化的值(for循环),每次a都有一个新函数。

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

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

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

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

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

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

给你一个简单的问题:“在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());

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

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