关于javascript:“new ”后的括号是否可选?

Parentheses after “new ” optional?

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

我在Chrome控制台中运行了以下一对代码段,结果相同:

1
2
3
4
5
6
7
8
9
test = new function(){
  var a = 1;
  var b = 2;
  var c = 3;
  this.debugBase = function(){console.log('' + a + b + c)};
};
test
debugBase: function (){console.log('' + a + b + c)}
__proto__: Object

与:

1
2
3
4
5
6
7
8
9
test2 = new (function(){
  var a = 1;
  var b = 2;
  var c = 3;
  this.debugBase = function(){console.log('' + a + b + c)};
})();
test2
debugBase: function (){console.log('' + a + b + c)}
__proto__: Object

我错过了什么吗? 函数后的括号有什么意义吗? 如果没有,为什么人们把它们放在那里?


这里提出了类似的问题:新的MyClass()与新的MyClass。 Daniel Vassallo完整且接受的答案:

Quoting David Flanagan1:

As a special case, for the new operator only, JavaScript simplifies the grammar by allowing the parenthesis to be omitted if there are no arguments in the function call. Here are some examples using the new operator:

1
2
o = new Object;  // Optional parenthesis omitted here
d = new Date();

就个人而言,我总是使用括号,即使构造函数不带参数。

此外,如果省略括号,JSLint可能会伤害您的感受。它报告Missing '()' invoking a constructor,并且似乎没有工具允许括号省略的选项。

1 David Flanagan:JavaScript权威指南:第4版(第75页)


因为您可以传递这样的参数,例如。

1
var x = new String(5); // '5'

除此之外,这是一个偏好的问题。


把parantheses实际上运行功能。没有它们,函数就是定义的。

编辑:我没有注意到你使用的"新"关键字。无论哪种情况都会调用您的函数。但是,您通常不需要新的关键字。在你给出的例子中,它们基本相同,最后的括号是多余的。

看看这个jsfiddle我的意思(http://jsfiddle.net/Gs2jH/)。

如果你运行它,你会看到只有第二个项目被调用。