Czy " (function () {}) () "i" (function () {} ()) " są funkcjonalnie równe w JavaScript? [duplikat]

To pytanie ma już odpowiedź tutaj:

Oba te bloki kodu poniżej alert foo następnie bar. Jedyna różnica to })() i }()).

Kod 1:

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

alert(bar);

Kod 2:

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

alert(bar);

Więc jest jakaś różnica, oprócz składnia?

Author: SLaks, 2011-05-09

3 answers

Nie; są identyczne


Jeśli jednak dodasz new wcześniej i .something później, będą one inne.

Kod 1

new (function() {
    this.prop = 4;
}) ().prop;

Ten kod tworzy nową instancję klasy tej funkcji, a następnie otrzymuje właściwość prop nowej instancji.
Zwraca 4.

Jest odpowiednikiem

function MyClass() {
    this.prop = 4;
}
new MyClass().prop;

Kod 2

new ( function() {
    return { Class: function() { } }; 
}() ).Class;

Ten kod wywołuje new na właściwości Class.
Ponieważ w nawiasach dla wywołania funkcji są wewnątrz zewnętrznego zestawu nawiasów nie są one pobierane przez wyrażenie new, a zamiast tego wywołują funkcję normalnie, zwracając jej wartość.
Wyrażenie new przetwarza do .Class i tworzy instancję. (nawiasy po {[4] } są opcjonalne)

Jest odpowiednikiem

var namespace = { Class: function() { } };

function getNamespace() { return namespace; }

new ( getNamespace() ).Class;
//Or,
new namespace.Class;

Bez nawiasów wokół wywołania do getNamespace(), byłoby to parsowane jako (new getNamespace()).Class - wywołałoby instancję klasy getNamespace i zwróciło właściwość Class nowej przykład.

 59
Author: SLaks,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-01 00:25:39

Nie ma różnicy - nawias otwierający służy tylko jako wskazówka składniowa, aby powiedzieć parserowi, że to, co następuje, jest wyrażeniem funkcji zamiast deklaracją funkcji.

 7
Author: Alnitak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-09 15:15:20

Nie ma różnicy. Oba są wyrażeniami funkcyjnymi.

Jest też trzecia droga:

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

(zamiast + inny operator też by działał)

Najczęstszym sposobem jest

(function() {
    // ...
})();
Chociaż.
 6
Author: ThiefMaster,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-09 15:11:40