这两个javascript函数调用有什么区别?
(function(){alert("foo")})()
与此相对:
(function(){alert("foo")}())
答案 0 :(得分:28)
这样做是为了便于阅读。
您给出的两个示例之间没有真正的功能差异,但它们都非常接近简单的函数声明, 不同。添加括号是为了便于阅读,以区分它们。
以下是每个代码段的作用:
在两个片段的第一个中,第一个括号将被计算为封闭函数的值。然后该值将作为函数调用。因此,最终将执行该功能,这可能是您关心的。
在你的第二个片段中,外括号将被评估为包含一个内联声明并立即执行的函数。同样,该函数将被执行,这仍然可能是你关心的。
这两个都将执行相同的功能,因此不会有任何显着差异。
像你这样的代码片段与简单的函数声明之间的区别:
您提供的功能也与以下内容相同。我刚刚添加了一个函数名,并为语法准确性分配了返回值,您现在可以忽略它。
// javascript...
var val =
function myFooFunc () {
alert("foo");
}();
然而,这很容易被误认为是一个简单的函数声明,它是不同的:
// javascript...
function myFooFunc () {
alert("foo");
}
请注意,这里唯一真正的区别是最后一个函数声明不会立即执行。其他人是。所以这是一个非常不同的行为(如果按名称调用简单声明,或者根本不执行,则可以稍后执行)。但是,通常很难看到语法上的差异,特别是如果函数体长得很长并且需要在屏幕上滚动。
为什么函数会立即执行?
当一个函数在声明后立即执行时,该值经常被返回到某个东西(它可能是赋值语句的一部分)。有时函数会立即执行,因为它包含内部函数,并用于为包含的语句提供函数范围。
基本上,人们围绕“立即执行”表单(两个片段和我的两个中的第一个)包围括号,以便向其他开发人员提供视觉提示,即立即调用该函数。它更容易阅读,因为在你到达函数结尾之前你可能不会捕到括号(或者完全注意它们)。
答案 1 :(得分:8)
他们都有类似的行为。
封装函数声明的括号告诉JavaScript引擎在解析后立即执行代码。在第一个示例中,您将创建一个函数对象,然后使用后面的括号调用它。在第二个示例中,您告诉JavaScript引擎创建函数对象并立即调用它。
示例:
// creates a function object
var f1 = (function() { alert('foo'); });
// creates a function object and executes it immediately
var f2 = (function() { alert('foo'); }());
不同之处在于f1为您提供了一个功能对象。 f2创建并调用匿名函数。