“new <function>”可选后的括号?</function>

时间:2011-06-22 11:47:34

标签: javascript initialization new-operator

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

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

对战:

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

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

3 个答案:

答案 0 :(得分:13)

此处提出了类似的问题:new MyClass() vs. new MyClass。 Daniel Vassallo完整且接受的答案:

  

引用David Flanagan 1

     
    

作为一种特殊情况,对于new运算符,JavaScript通过允许在函数调用中没有参数时省略括号来简化语法。以下是使用new运算符的一些示例:

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

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

     

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

     
     

1 David Flanagan:JavaScript the Definitive Guide: 4th Edition(第75页)

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

放置parantheses实际上运行该函数。没有它们,函数就被定义了。

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

请参阅此jsfiddle我的意思(http://jsfiddle.net/Gs2jH/)。

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