2011-07-11 80 views
29

这两个javascript函数调用有什么区别?为什么使用括号来包装javascript函数调用?

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

与此:

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

我认为这两者都会给出相同的含义,换句话说,两者都是相同的。 –

+0

区别只是轻微的,主要是风格。有些人喜欢在分组操作员(如道格拉斯克罗克福德)内部有正式的参数列表(又名“呼叫操作员”),其他人则喜欢外部参与者。没有实际区别 - 尝试[Ben Alman的立即调用函数表达式](http://benalman.com/news/2010/11/immediately-invoked-function-expression/)。 – RobG

回答

28

这样做是为了便于阅读。

没有你给了两个例子之间的真正的功能上的差异,但他们两人都非常接近一个简单的函数声明,这是不同。括号为了便于阅读而添加,以便区分它们。

下面是每个片段的事:

在第一你的两个片断,第一个括号将作为封闭功能的价值进行评估。然后这个值将被称为函数。所以最终这个函数将被执行,这可能是你关心的。

在你的第二个片段中,外括号将被评估为包含一个声明为内联并立即执行的函数。再一次,该函数将被执行,这仍然可能是你关心的。

这两个都会执行相同的功能,所以不会有任何显着差异。

像您这样的片段和一个简单的函数声明的区别:

你给的功能也相同于以下。我刚刚添加了一个函数名称,并为语法准确性指定了返回值,您现在可以忽略它。

// javascript... 
var val = 
    function myFooFunc() { 
    alert("foo"); 
    }(); 

然而,这将是很容易误认为是一个简单的函数声明,这是不同的:

// javascript... 
function myFooFunc() { 
    alert("foo"); 
} 

注意,这里唯一的真正的区别是,这最后一个函数声明不立即执行。其他人是。所以这是一个非常不同的行为(如果简单声明是按名称调用的,它可能稍后会执行,或者它可能根本不会执行)。但是,通常很难在语法上看到这种差异,特别是如果函数体变得很长并且需要在屏幕上滚动。

为什么函数立即执行?

当函数在声明后立即执行时,该值通常会返回到某个值(可能是赋值语句的一部分)。有时函数会立即执行,因为它包含内部函数并且正在用于为包含语句提供功能范围。

本质上,人们围绕“立即执行”表单(包括您的代码段和我的两个第一个表单)来包装括号,以便为其他开发人员提供一个视觉提示,即立即调用该函数。这只是更容易阅读,因为你可能没有捕捉括号,直到你到达函数的结尾(或者注意到它们)。

+0

我的第一个代码段出现语法错误。但是,当我把变量放在第一个片段函数的前面时,它工作的很好。 –

+2

@Dejan - 那是因为第一个例子**是一个语法错误。分组操作符不能跟随函数声明。在* function *关键字之前的前导“(”)将其更改为函数表达式,并且最后需要匹配的结尾“)”。一旦更改为函数表达式,名称就变为可选。 – RobG

+0

是的,我已经删除了第一个片段中的外括号,以便更多地关注它与第二个片段之间的区别。但是,考虑到您的评论,我认为如果该示例没有作为独立片段运行,它最终可能更令人分心。为了解决这个问题,我对第一个代码片段做了一个小小的修改,希望这个代码片段不会分散注意力,但是允许第一个代码片段完全有效。 – keparo

7

他们都有相似的行为。

封装函数声明的圆括号告诉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创建并调用一个匿名函数。

+7

这两个示例中都不需要分组运算符,它用于提高可读性。不同之处在于第一个分配函数给变量,第二个分配调用函数的结果。 – RobG

相关问题