这两个JavaScript声明有什么区别?

SBe*_*Bel 10 javascript

对于其中一个," ()"在里面,而另一个在外面.他们来了:

var a = (function() {
    return {
        bla: function() {
            console.log('a');
        }
    };
} () );

var b = (function() {
    return {
        bla: function() {
            console.log('b');
        }
    };
}) ();

a.bla();
b.bla();
Run Code Online (Sandbox Code Playgroud)

小智 9

没有区别.

[不必要的]括号只是在不同的地方.函数声明已经是一个表达式,因为它位于何处.如果声明在语句上下文中(并且具有讽刺意味的是它们会将其转换回表达式上下文),那么括号会产生差异,同时仍会产生等效的代码.


类似场景中括号的常见用法是自调用函数.在这种情况下需要括号,因为

function x () { alert("hi!") } ()
Run Code Online (Sandbox Code Playgroud)

被解析为

function x () { alert("hi!") }; ()
Run Code Online (Sandbox Code Playgroud)

当它显示为一个语句 - 或"块的顶级元素" - 它被解析为"FunctionDeclaration".因此,经常使用以下形式:

(function () { alert("hi!") })()
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为function ...它不再是一个语句,如上所述,而是一个表达式(解析为"FunctionExpression"),并且表达式可以继续,因此自动分号插入不会像前一种情况那样发生.另请注意,可以省略函数名称.

但是,因为在帖子中function ...出现在(在"AssignmentExpression"中)的右侧,因此它已经在表达式上下文中(被解析为"FunctionExpression"),因此不需要额外的括号.=

所有这些都是相同的,但我更喜欢第二种形式(为了我的代码中的一致性):

a = function () {} ()
b = (function () {}) ()
c = (function () {} ())
Run Code Online (Sandbox Code Playgroud)

快乐的编码.


Guf*_*ffa 1

没有实际的区别,只是 Javascript 引擎如何将函数视为值的细微差别。

使用( function(){} () );you 会导致函数成为一个值,因为语句不能以括号开头。使用( function(){} ) ();括号首先将函数计算为值,然后调用它。