Скобки после "new <function>" опционально?

Я запустил следующую пару фрагментов кода в консоли 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

Versus:

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

Я что-то упустил? Есть ли какое-либо значение для круглых скобок после функции? Если нет, то почему люди там их кладут?

Ответ 1

Здесь были заданы аналогичные вопросы: новый MyClass() и новый MyClass. Полный и принятый ответ Даниэля Вассалло:

Цитата Дэвид Фланаган 1:

В качестве специального случая, только для оператора new, JavaScript упрощает грамматику, позволяя исключить круглую скобку, если в вызове функции нет аргументов. Вот несколько примеров с помощью оператора new:

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

Лично я всегда использую круглые скобки, даже если конструктор не принимает аргументов.

Кроме того, JSLint может повредить ваши чувства, если вы опустите скобки. Он сообщает Missing '()' invoking a constructor, и, похоже, нет возможности для инструмента переносить опустошение в скобках.


1 Дэвид Фланаган: JavaScript Полное руководство: 4-е издание (стр. 75)

Ответ 2

Поскольку вы можете передавать такие параметры, например,

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

Кроме того, это вопрос предпочтения.

Ответ 3

наложение скобок на самом деле запускает функцию. Без них функция только что определена.

EDIT: Я не заметил ключевое слово "новое", которое вы использовали. Ваша функция вызывается в любом случае. Однако вам вообще не требуется новое ключевое слово. В примере, который вы указали, они по существу одинаковы, скобки в конце являются избыточными.

Смотрите этот jsfiddle для того, что я имею в виду (http://jsfiddle.net/Gs2jH/).

Если вы запустите его, вы увидите, что вызывается только второй элемент.