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 })(); |
您需要外括号的原因是因为以
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.
是的,最有可能保持全局命名空间清洁。
大多数库都是匿名函数,没有名称。
所以它需要立即执行。因为你以后不能调用一个没有名字且必须立即调用的函数。