这两个JavaScript函数调用之间有什么区别?
(function(){alert("foo")})()
相对于这个:
(function(){alert("foo")}())
这两个JavaScript函数调用之间有什么区别?
(function(){alert("foo")})()
相对于这个:
(function(){alert("foo")}())
这么做是为了可读性。
你给出的两个例子没有真正的功能区别,但它们都非常接近于一个简单的函数声明,而这是不同的。添加括号是为了增加可读性以便区分它们。
以下是你的代码片段各自的作用:
在你给出的第一个代码片段中,第一个括号将被评估为包含的函数的值。然后该值将被作为函数调用。因此最终将执行该函数,这可能是你关心的。
在你的第二个代码片段中,外部括号将被评估为内联声明并立即执行的函数。同样,该函数将被执行,这仍然可能是你关心的。
这两种方法都将执行相同的函数,所以没有任何显著的区别。
这样做与简单函数声明之间的区别:
你给出的函数也与以下函数相同。我只是添加了一个函数名并分配了返回值以进行语法上的准确性,你现在可以忽略它。
// javascript...
var val =
function myFooFunc () {
alert("foo");
}();
然而,这很容易被误解为一个简单的函数声明,但实际上它们是不同的:
// javascript...
function myFooFunc () {
alert("foo");
}
请注意,这里唯一的真正差异在于,最后一个函数声明不会立即执行,而其他函数则会被执行。因此,这是非常不同的行为(如果通过名称调用简单声明,则可能稍后执行,或者根本不会执行)。然而,特别是如果函数体变得非常长并需要在屏幕上滚动,往往很难立即看出语法上的区别。它们都有类似的行为。
括号包含函数声明,告诉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则创建并调用一个匿名函数。