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."

Zastanawiałam się, jaka jest różnica? Czy ten pierwszy zajmuje pamięć, pozostawiając wokół globalnej, anonimowej funkcji? Gdzie powinien znajdować się nawias?
Author: Community, 2010-08-02

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"
 62
Author: meder omuraliev,
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)()
 13
Author: Triptych,
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.

 7
Author: Cristian Sanchez,
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 ;-) }
 -3
Author: Behrad Khodayar,
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