(function() {...}()); 之间有区别吗?和 (function() {...})();?

IT技术 javascript anonymous-function
2021-02-10 15:32:28

可能的重复:
自动执行匿名 JavaScript 函数的括号位置?

有时我会看到:

(function() { ... }()); 

有时我会看到:

(function() { ... })(); 

我看到有和没有参数的两种形式。它们 执行匿名函数。

这两种形式有区别吗?使用一种形式而不是另一种形式有什么令人信服的理由吗?

3个回答

这两种形式没有实际区别,但从语法的角度来看,两者之间的区别在于分组运算符- 括号 - 将在第一个示例 a 中成立CallExpression,其中包括FunctionExpression

               调用表达式
                | |
       函数表达式 |
                | |
                VV
    (功能() { }());
    ^ ^
    |--主要表达式--|

在第二个例子中,我们首先有一个整体CallExpression,它包含FunctionExpression

          主表达式
                |
         函数表达式
                |
    (功能() { })();
    ^ ^
    |-- 调用表达式--|

就编译器而言,两者没有区别。但是,会发现(function () {}())Douglas Crockford 的 JavaScript代码约定中推荐样式

... “Crockford on JavaScript —— 第三幕:终极功能”(2010 年 2 月 17 日)。在 56:09 分钟。
2021-03-17 15:32:28
更清楚的是,Crockford 不(明确)推荐该链接中的任何一种形式。Crockford 推荐的唯一相关内容是将自执行函数包装在括号中。
2021-03-20 15:32:28
更正:(function(){}());
2021-03-21 15:32:28
“[...] 一次又一次,我将整个函数和调用包装在括号中。作为向读者表示,除了函数的分配之外,还有更重要的事情发生。有些人会黄金括号。围绕函数而不是整个调用——这对我来说没有意义,因为我们试图告诉用户的是:“看整个事情”,并在它的一部分周围加上括号,我认为,会适得其反,所以我认为整个事情都需要用括号包裹起来。” ——道格拉斯·克罗克福德。
2021-03-21 15:32:28
正如摩西所写,看起来情况正好相反。从该文本:When a function is to be invoked immediately, the entire invocation expression should be wrapped in parens so that it is clear that the value being produced is the result of the function and not the function itself....(function() { ... }());
2021-04-10 15:32:28

就差异而言,它实际上只是语法糖。有点等同于:“你喜欢 jQuery() 还是 $()?” 两者都可以编译、执行和互换使用 (AFAIK)。

从我目前看到的代码示例来看,似乎有更多人遵循 Crockford 代码约定:

(function() { ... }()); 

就我个人而言,我更喜欢这种(function(){})();约定,因为对我来说更明显的是该函数是自动执行的;我也是 jQuery 的大用户,这是 jQuery 源代码中使用的约定。

此外,无论您选择使用哪种形式,使用括号来包含您的自执行函数被认为是一种很好的做法。

“主要公约”有来源吗?
2021-03-14 15:32:28
@Casey - Crockford 在他的 [代码约定]( javascript.crockford.com/code.html ) 中提到了它- MozillaDrupal约定似乎都没有提到它。
2021-04-02 15:32:28