我正在处理一些代码,其中给定页面有许多与之关联的.js文件(利用它们像库一样)。每个.js文件都在里面看起来像这样:
(function() {
.... all the lib functions and objects ....
})();
经过一段时间的播放后,我看到格式(function(){...})(); 的功能会自动调用。如果我剥离外部paren的 function(){...} ,那么代码无效。如果我添加一个函数名,那么代码是有效的,但在调用 function foo(){...} 之前不会运行。
是否有特殊原因以这种方式编写了lib?我猜它会封装变量名等。它的语法是什么允许它在页面加载时自动运行?
答案 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?我猜它会封装变量名等等。
是的,最有可能保持全局命名空间的清洁。