Lokalizacja nawiasu dla automatycznego wykonywania anonimowych funkcji JavaScript?
Porównywałem ostatnio aktualną wersję json2.js z wersją, którą miałem w swoim projekcie i zauważyłem różnicę w tym, jak wyrażenie funkcji zostało utworzone i wykonane samodzielnie.
Kod używany do zawijania anonimowej funkcji w nawiasie, a następnie jej wykonywania,
(function () {
// code here
})();
Ale teraz zawija automatycznie wykonaną funkcję w nawiasie.
(function () {
// code here
}());
Jest komentarz CMS w zaakceptowanej odpowiedzi wyjaśnić JavaScript encapsulated anonymous function składnia , że " zarówno: (function(){})();
jak i (function(){}());
są poprawne."
4 answers
Są praktycznie takie same.
Pierwszy zawija nawiasy wokół funkcji, aby uczynić ją prawidłowym wyrażeniem i wywołuje ją. Wynik wyrażenia jest nieokreślony.
Drugi wykonuje funkcję, a nawiasy wokół automatycznego wywołania sprawiają, że jest to poprawne wyrażenie. Ocenia również do undefined.
Nie wydaje mi się, że istnieje "właściwy" sposób na zrobienie tego, ponieważ wynik wyrażenia jest taki sam.
> function(){}()
SyntaxError: Unexpected token (
> (function(){})()
undefined
> (function(){return 'foo'})()
"foo"
> (function(){ return 'foo'}())
"foo"
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
2010-08-02 01:49:17
W takim razie to bez znaczenia. Wywołujesz wyrażenie, które rozwiązuje funkcję w pierwszej definicji oraz definiujesz i natychmiast wywołujesz funkcję w drugim przykładzie. Są podobne, ponieważ wyrażenie funkcji w pierwszym przykładzie jest tylko definicją funkcji.
Istnieją inne, bardziej użyteczne przypadki wywoływania wyrażeń, które rozwiązują funkcje:
(foo || bar)()
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
2012-02-16 16:34:51
Nie ma żadnej różnicy poza składnią.
Odnośnie Twoich obaw dotyczących drugiej metody robienia tego:
Rozważmy:
(function namedfunc () { ... }())
namedfunc
nadal nie będzie w zasięgu globalnym, nawet jeśli podałeś nazwę. To samo dotyczy funkcji anonimowych. Jedynym sposobem na uzyskanie go w tym zakresie byłoby przypisanie go do zmiennej wewnątrz parens.
((namedfunc = function namedfunc () { ... })())
Zewnętrzne pareny są niepotrzebne:
(namedfunc = function namedfunc () { ... })()
Ale nie chciałeś tej globalnej deklaracji w każdym razie, a Ty?
Więc to sprowadza się do:
(function namedfunc () { ... })()
I możesz ją jeszcze zredukować: nazwa jest niepotrzebna, ponieważ nigdy nie będzie używana (chyba że twoja funkcja jest rekurencyjna.. i nawet wtedy możesz użyć arguments.callee
)
(function () { ... })()
Tak o tym myślę(może być niepoprawne, nie czytałem jeszcze specyfikacji ECMAScript). Mam nadzieję, że to pomoże.
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-08-30 12:40:31
Różnica istnieje tylko dlatego, że Douglas Crockford nie lubi pierwszego stylu dlaIIFEs ! [seriuosly] Jak widać na tym filmie!!.
Jedynym powodem istnienia dodatkowego owijania ()
{w obu stylach} jest pomoc w wywołaniu tej sekcji kodu wyrażenia funkcji , ponieważ deklaracja funkcji nie może być natychmiast wywołana. Niektóre skrypty / minify-ers używają tylko +
, !
, -
& ~
zamiast zbyt w nawiasach. Tak:
+function() {
var foo = 'bar';
}();
!function() {
var foo = 'bar';
}();
-function() {
var foo = 'bar';
}();
~function() {
var foo = 'bar';
}();
I wszystkie te są dokładnie takie same jak twoje alternatywy. Wybór spośród tych przypadków jest całkowicie na własną rękę i nie ma znaczenia. {Te z ()
wytwarzają 1 bajt większy plik ;-) }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
2017-02-24 15:25:02