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?
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.
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.
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ż.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