只有在调用时,Javascript函数才会自动运行

Javascript functions run automatically vs only when called

本问题已经有最佳答案,请猛点这里访问。

我正在研究一些代码,其中给定页面有许多与之关联的.js文件(利用它们像库一样)。 每个.js文件都在里面看起来像这样:

1
2
3
(function() {
    .... all the lib functions and objects ....
})();

经过一些游戏后,我看到了格式的函数(function(){...})(); 自动调用。 如果我剥离外部paren的函数(){...},那么代码无效。 如果我添加一个函数名,那么代码是有效的,但在调用函数foo(){...}之前不会运行。

lib是以这种方式编写的特殊原因吗? 我猜它会封装变量名等。 它的语法是什么允许它在页面加载时自动运行?


这被称为IIFE,即立即调用的函数表达式。

它允许您定义变量,包括函数,这些变量在外部作用域中不可见,并且不会妨碍全局名称空间。

1
2
3
(function() {
    var v = ... // this variable can be used in the IIFE but not from outside
})();

您需要外括号的原因是因为以function something开头的语句被解释为函数声明,由于函数声明需要名称,因此这将无效。你必须使用一个技巧使它成为一个表达式。括号那样做,但你可以使用其他技巧,例如

1
2
3
+function(){
  ...
}();

但外括号是最清晰的,可能不那么令人惊讶的解决方案。


What is it about the syntax of this that allows it to be run automatically on page load

它没有在页面加载时调用,它在声明后立即被调用。那是因为包含了调用括号:

1
2
})();
  ^^

If I strip away the outer paren's to have function() {...} then the code is invalid.

这是一个已知的JavaScript语法怪癖:必须将其视为一个能够立即调用的函数表达式;否则,它被解释为一个函数声明,不能立即调用。

Is there a special reason the lib has been written in this way? I would guess it would encapsulate variable names and such.

是的,最有可能保持全局命名空间清洁。


大多数库都是匿名函数,没有名称。

所以它需要立即执行。因为你以后不能调用一个没有名字且必须立即调用的函数。