为什么括号用于包装javascript函数调用?

时间:2011-07-11 04:32:23

标签: javascript

这两个javascript函数调用有什么区别?

(function(){alert("foo")})()

与此相对:

(function(){alert("foo")}()) 

2 个答案:

答案 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创建并调用匿名函数。