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

IT技术 javascript
2021-02-19 23:05:39

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

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

与此相反:

(function(){alert("foo")}()) 
2个回答

这样做是为了可读性。

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

以下是您的每个片段的作用:

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

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

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

像你这样的代码片段和简单的函数声明之间的区别:

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

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

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

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

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

为什么函数会立即执行?

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

从本质上讲,人们将括号括在“立即执行”形式(您的两个片段和我的两个片段中的第一个)周围,以便向其他开发人员提供一个视觉提示,即该函数正在被立即调用。它更容易阅读,因为在到达函数末尾之前(或根本没有注意到它们),您可能无法抓住括号。

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

他们都有相似的行为。

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

两个示例中都不需要分组运算符,它用于提高可读性。区别在于,第一个将函数赋值给变量,第二个将调用函数的结果赋值。
2021-04-25 23:05:39