5

我正在处理一些代码,其中给定页面有许多与之关联的 .js 文件(像库一样使用它们)。每个 .js 文件在内部如下所示:

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

经过一番播放,我看到格式为(function() {...})(); 的函数;被自动调用。如果我剥离外部括号以具有function() {...}则代码无效。如果我添加一个函数名,那么代码是有效的,但在调用function foo() { ... }之前不会运行。

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

4

3 回答 3

6

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

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

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

您需要外括号的原因是因为以开头的语句function something被解释为函数声明,这在此处无效,因为函数声明需要 name。您必须使用技巧使其成为一种表达方式。括号这样做,但你可以使用其他技巧,例如

+function(){
  ...
}();

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

于 2013-06-16T18:20:22.150 回答
1

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

所以需要立即执行。因为您不能稍后调用没有名称且必须立即调用的函数。

于 2013-06-16T18:21:05.870 回答
1

允许它在页面加载时自动运行的语法是什么

它不是在页面加载时调用的,而是在声明之后立即调用的。那是因为包括调用括号:

})();
  ^^

如果我去掉外部括号,function() {...}则代码无效。

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

以这种方式编写lib是否有特殊原因?我猜它会封装变量名等。

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

于 2013-06-16T18:21:19.693 回答