这两个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 创建并调用匿名函数。