一尘不染

JavaScript中的“(function(){})()”和“(function(){}())”在功能上是否相等?

javascript

均低于警戒这些代码块foo,然后bar。唯一的区别是})()}())

代码1:

(function()
{
    bar = 'bar';
    alert('foo');
})();

alert(bar);

代码2:

(function()
{
    bar = 'bar';
    alert('foo');
}());

alert(bar);

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


阅读 245

收藏
2020-04-25

共1个答案

一尘不染

没有; 他们是相同的


但是,如果在new前后添加.something,它们将有所不同。

代码1

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

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

相当于

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

代码2

new ( function() {
    return { Class: function() { } }; 
}() ).Class;

此代码调用newClass属性。
由于函数调用的括号位于括号的外部集之内,因此new表达式不会选择它们,而是正常调用该函数,并返回其返回值。
new表达式解析到.Class并将其实例化。(后面的括号new是可选的)

相当于

var namespace = { Class: function() { } };

function getNamespace() { return namespace; }

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

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

2020-04-25