“(function(){})()”和“(function(){}())”在JavaScript中功能相同吗?

Are “(function ( ) { } ) ( )” and “(function ( ) { } ( ) )” functionally equal in JavaScript?

本问题已经有最佳答案,请猛点这里访问。


下面这两个代码块都警告foo然后bar。 唯一的区别是})()}())


代码1:

1
2
3
4
5
6
7
(function()
{
    bar = 'bar';
    alert('foo');
})();

alert(bar);


代码2:

1
2
3
4
5
6
7
(function()
{
    bar = 'bar';
    alert('foo');
}());

alert(bar);


除了语法之外,还有什么区别吗?



没有;他们是相同的


但是,如果事先添加new,之后添加.something,它们将会不同。

代码1

1
2
3
new (function() {
    this.prop = 4;
}) ().prop;


此代码创建此函数类的新实例,然后获取新实例的prop属性。
它返回4


它相当于

1
2
3
4
function MyClass() {
    this.prop = 4;
}
new MyClass().prop;

代码2

1
2
3
new ( function() {
    return { Class: function() { } };
}() ).Class;


此代码在Class属性上调用new
由于函数调用的括号在外部括号中,因此new表达式不会拾取它们,而是正常调用函数,返回其返回值。
new表达式解析.Class并实例化它。 (new之后的括号是可选的)


它相当于

1
2
3
4
5
6
7
var namespace = { Class: function() { } };

function getNamespace() { return namespace; }

new ( getNamespace() ).Class;
//Or,
new namespace.Class;


如果没有围绕getNamespace()调用的括号,则会将其解析为(new getNamespace()).Class—它将调用实例化getNamespace类并返回新实例的Class属性。



没有区别 - 开头括号只作为语法提示告诉解析器接下来是函数表达式而不是函数声明。



没有区别。两者都是函数表达式。


还有第三种方式:

1
2
3
4
+function() {
    bar = 'bar';
    alert('foo');
}();


(而不是+另一个运营商也会工作)


最常见的方式是

1
2
3
(function() {
    // ...
})();


虽然。