【问题标题】:Why are parenthesis used to wrap a javascript function call? [duplicate]为什么用括号来包装 javascript 函数调用? [复制]
【发布时间】:2011-07-11 04:32:22
【问题描述】:

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

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

与此相反:

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

【问题讨论】:

  • 我认为这两者都会给出相同的含义,换句话说,两者都是相同的。
  • 差异很小,主要是风格。有些人更喜欢在分组运算符(如 Douglas Crockford)中包含形式参数列表(又名“调用运算符”),而另一些人则喜欢在外部使用。没有实际区别 - 试试Ben Alman's Immediately-Invoked Function Expression

标签: javascript


【解决方案1】:

这样做是为了便于阅读。

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

以下是每个 sn-ps 的作用:

在您的两个 sn-ps 中的第一个中,第一个括号将被评估为封闭函数的值。然后这个值将作为函数调用。所以最终函数会被执行,这可能是你关心的。

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

两者都将执行相同的功能,因此不会有任何显着差异。

像你这样的 sn-p 和简单的函数声明的区别:

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

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

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

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

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

为什么函数会立即执行?

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

基本上,人们将括号括在“立即执行”表单(您的 sn-ps 和我的两个中的第一个)周围,以便向其他开发人员提供该函数正在被立即调用的视觉提示。它更易于阅读,因为您可能在到达函数末尾(或完全注意到它们)之前无法捕捉到括号。

【讨论】:

  • 我在您的第一个 sn-p 上遇到语法错误。但是当我将变量放在第一个 sn-p 函数前面时,它工作正常。
  • @Dejan - 这是因为第一个示例 语法错误。函数声明后面不能跟分组运算符。 function 关键字之前的前导“(”将其更改为函数表达式,当然最后还需要匹配的结束“)”。一旦更改为函数表达式,名称就变为可选的。
  • 是的,我已经删除了我的第一个 sn-p 中的外括号,以便更多地注意它和我的第二个之间的区别。但是,鉴于您的评论,我认为如果该示例不作为独立的 sn-p 运行,最终可能会让人分心。为了解决这个问题,我对第一个 sn-p 做了一个小编辑,希望不会分散太多注意力,但允许第一个 sn-p 完全有效。
【解决方案2】:

他们都有相似的行为。

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

【讨论】:

  • 在这两个示例中都不需要分组运算符,它用于提高可读性。不同的是,第一个将函数赋值给变量,第二个将调用函数的结果赋值。
猜你喜欢
  • 2012-02-21
  • 2011-08-14
  • 1970-01-01
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 2015-03-26
  • 2016-07-21
相关资源
最近更新 更多