繁体   English   中英

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

[英]What is the difference between these 2 JavaScript declarations?

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

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

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

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

没有区别。

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


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

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

被解析为

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

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

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

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

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

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

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

快乐的编码。

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

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

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

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


几个相关的问题:

JSLint错误:“将调用移动到包含该函数的parens”

解决JSLint错误

没有实际的区别,它只是一个微妙的差异,你如何使Javascript引擎将该函数视为一个值。

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

我认为这是相同的区别:

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

...没有不同 :)

结束括号意味着:当要立即调用一个函数时,整个调用表达式应该包含在parens中,这样很明显产生的值是函数的结果而不是函数本身。 (取自这里

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM