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

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

在这:

//Bunch of code...

当前回答

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

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

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

其他回答

自调用函数在javascript:

自动调用(启动)自调用表达式,而不需要调用。自调用表达式在创建后立即被调用。这主要用于避免命名冲突以及实现封装。变量或声明的对象在此函数之外不可访问。为了避免最小化(filename.min)的问题,总是使用自执行函数。

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

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

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

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

简单。所以看起来很正常,几乎令人欣慰:

var userName = "Sean";

console.log(name());

function name() {
  return userName;
}

但是,如果我在我的页面中包含一个非常方便的javascript库,它可以将高级字符转换为基本级别表示呢?

等待……什么?

我的意思是,如果有人输入一个带有某种口音的字符,但我只想在我的程序中输入“英语”字符a - z ?嗯…西班牙语的“ñ”和法语的“é”可以翻译成基本字符“n”和“e”。

所以有人写了一个全面的字符转换器,我可以包括在我的网站…我把它包括在内。

有一个问题:它有一个名为“name”的函数,与我的函数相同。

这就是所谓的碰撞。我们在同一个作用域中声明了两个同名的函数。我们要避免这种情况。

因此,我们需要以某种方式确定代码的范围。

在javascript中作用域代码的唯一方法是将其包装在函数中:

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter library's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

那也许能解决我们的问题。现在所有内容都是封闭的,只能从开括号和闭括号内访问。

我们有一个函数中的一个函数。看起来很奇怪,但完全合法。

只有一个问题。我们的代码不能工作。 我们的userName变量从来没有回显到控制台!

我们可以通过在现有代码块之后添加对函数的调用来解决这个问题…

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

main();

或之前!

main();

function main() {
  // We are now in our own sound-proofed room and the 
  // character-converter libarary's name() function can exist at the 
  // same time as ours. 

  var userName = "Sean";

  console.log(name());

  function name() {
    return userName;
  }
}

第二个问题是:“main”这个名字还没有被使用的可能性有多大?...非常非常苗条。

我们需要更多的范围。以及自动执行main()函数的方法。

现在我们来讨论自动执行函数(或自动执行、自动运行等等)。

((){})();

语法非常笨拙。然而,它是有效的。

当你用圆括号包装一个函数定义,并包含一个形参列表(另一个集合或圆括号!),它就像一个函数调用。

所以让我们再看看我们的代码,使用一些自动执行的语法:

(function main() {
  var userName = "Sean";
                
    console.log(name());
                
    function name() {
      return userName;
    }
  }
)();

所以,在你阅读的大多数教程中,你现在都会被“匿名自动执行”或类似的术语轰炸。

经过多年的专业开发,我强烈建议您为调试目的而编写的每个函数都命名。

当出现错误时(它会出错),您将在浏览器中检查回溯。当堆栈跟踪中的条目有名称时,总是更容易缩小您的代码问题!

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

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

自我调用(也称为 自动调用)是当一个函数 立即执行 定义。这是一个核心模式 它是许多人的基础 JavaScript的其他模式 发展。

我是它的超级粉丝:)因为:

它使代码减至最少 它实现了行为与表示的分离 它提供了一个闭包,可以防止命名冲突

(为什么你要说它是好的?)

它是关于一次定义和执行一个函数。 你可以让这个自动执行的函数返回一个值,并将该函数作为参数传递给另一个函数。 它有利于封装。 它也适用于块作用域。 是的,你可以把你所有的.js文件封装在一个自动执行的函数中,并且可以防止全局命名空间污染。;)

更多的在这里。