Подтвердить что ты не робот

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

Оба этих блока кода ниже предупреждают foo, затем bar. Единственное отличие: })() и }()).

Код 1:

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

alert(bar);

Код 2:

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

alert(bar);

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

4b9b3361

Ответ 1

Нет; они идентичны


Однако, если вы добавите 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 нового экземпляра.

Ответ 2

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

Ответ 3

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

Существует и третий способ:

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

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

Наиболее распространенным способом является

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

хотя.