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

时间:2013-06-16 18:19:00

标签: javascript

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

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

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

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

3 个答案:

答案 0 :(得分:6)

这称为IIFE,Immediately-Invoked Function Expression

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

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

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

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

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

答案 1 :(得分:1)

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

因此需要立即执行。因为以后无法调用没有名称的函数而必须立即调用。

答案 2 :(得分:1)

  

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

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

})();
  ^^
  

如果我剥离外部paren的function() {...},则代码无效。

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

  

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

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