"(Function () { }) ()" и "(function () { } ())" функционально равны в JavaScript?

Оба из этих блоков кода ниже оповещения foo затем bar, Единственная разница })() а также }()),

Код 1:

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

alert(bar);

Код 2:

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

alert(bar);

Так есть ли разница, кроме синтаксиса?

3 ответа

Решение

Нет; они одинаковые


Однако, если вы добавите 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;

Этот код вызывает new на Class имущество.
Так как скобки для вызова функции находятся внутри внешнего набора скобок, они не подхватываются 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 свойство нового экземпляра.

Нет никакой разницы - открывающая фигурная скобка служит только синтаксической подсказкой, сообщающей парсеру, что ниже следует выражение функции вместо объявления функции.

Там нет разницы. Оба являются функциональными выражениями.

Есть и третий путь:

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

(вместо + другой оператор тоже будет работать)

Самый распространенный способ

(function() {
    // ...
})();

хоть.

Другие вопросы по тегам