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

时间:2012-03-16 08:32:15

标签: javascript

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

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

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

a.bla();
b.bla();

5 个答案:

答案 0 :(得分:9)

没有区别。

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


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

function x () { alert("hi!") } ()

被解析为

function x () { alert("hi!") }; ()

当它显示为语句 - 或“块的顶级元素”时 - 它被解析为“FunctionDeclaration”。因此,经常使用以下形式:

(function () { alert("hi!") })()

这是有效的,因为function ...不再是一个语句,如上所述,而是一个表达式(解析为“FunctionExpression”),表达式可以继续这样,Automatic Semicolon Insertion不会像前一种情况那样发生。另请注意,函数名称可以省略。

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

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

a = function () {} ()
b = (function () {}) ()
c = (function () {} ())

快乐的编码。

答案 1 :(得分:2)

没有真正的区别。两者都以相同的方式工作。如果要传递JSLint,则需要使用第一个模式,其中调用括号位于另一组括号内。如果不这样做,您将收到以下错误:

  

将调用移动到包含该函数的parens中。

另请注意,第一组括号不是必需的。它将在没有它们的情况下工作,但JSLint将再次失败:

  

在括号中包含一个立即的函数调用来帮助   读者理解表达式是一个结果   功能,而不是功能本身。


一些相关的问题:

JSLint error: "Move the invocation into the parens that contain the function"

Solution for JSLint errors

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

我认为与此相同:

var myObj = {bla:'blabla'}; 
var a = (myObj);
var b = myObj;

......没有区别:)

答案 4 :(得分:0)

结尾括号表示:当要立即调用函数时,整个调用表达式应该包含在parens中,以便明确表示生成的值是函数的结果而不是函数本身。 (取自here

因此,如果使用{}(),则立即执行该函数,并为变量赋值函数result。

然后,如果使用({})(),如果()之间存在函数,则执行该函数并将值赋给变量。

如果它们在我看来包含相同的功能,它们是相同的。