Скобки после "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/).
Если вы запустите его, вы увидите, что вызывается только второй элемент.