Składnia natychmiastowego wywołania funkcji

Istnieje opcja JSLint , jedna z dobrych części w rzeczywistości, że "[wymaga] parens wokół natychmiastowych wywołań", co oznacza, że konstrukcja

(function () {

  // ...

})();

Zamiast tego należy zapisać jako

(function () {

  // ...

}());
Moje pytanie brzmi: czy ktoś może wyjaśnić, dlaczego ta druga forma może być uważana za lepszą? Czy jest bardziej odporny? Mniej podatne na błędy? Jaką przewagę ma nad pierwszą formą?
Odkąd zadałem to pytanie, zrozumiałem znaczenie posiadania wyraźnego wizualnego rozróżnienia między wartościami funkcji a wartościami funkcji. Rozważmy przypadek, w którym wynikiem natychmiastowego wywołania jest Prawa strona wyrażenia przypisania:
var someVar = (function () {

  // ...

}());

Choć nawiasy zewnętrzne są zbędne składniowo, nawias otwierający wskazuje z góry, że przypisywana wartość jest , a nie samą funkcją, ale raczej wynikiem wywołanej funkcji.

To jest podobne do Rady Crockforda dotyczącej kapitalizacji funkcji konstruktora - ma służyć jako wizualny sygnał dla każdego, kto patrzy na kod źródłowy.

Author: Paolo Moretti, 2009-06-02

3 answers

Z poradnika style convention guide: (Szukaj "wywołanego natychmiast")

Gdy funkcja ma być wywołana natychmiast, całe wyrażenie wywołania powinno być zawinięte w nawiasy, aby było jasne, że wytwarzana wartość jest wynikiem funkcji, a nie samej funkcji.

Więc, w zasadzie, on uważa, że to sprawia, że bardziej jasne rozróżnienie między wartościami funkcji, a wartościami funkcji. Więc to stylistyka Materia, a nie merytoryczna różnica w samym kodzie.

zaktualizowany odnośnik, Stary PPT już nie istnieje

 67
Author: cgp,
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
2014-07-29 19:24:16

Natychmiast wywołane funkcje anonimowe są owinięte w parens, ponieważ:

  1. Są one wyrażeniami funkcyjnymi, a pominięcie parensów spowodowałoby, że zostanie ono zinterpretowane jako deklaracja funkcji, która jest błędem składni.

  2. Wyrażenia funkcyjne nie mogą zaczynać się od słowa funkcja.

  3. Podczas przypisywania wyrażenia funkcji do zmiennej, sama funkcja nie jest zwracana, zwracana jest wartość zwracana funkcji , stąd parens Oceń, co jest w nich i wytworz wartość. gdy funkcja jest wykonywana, a końcowe pareny ..}() powodują natychmiastowe wykonanie funkcji.

 2
Author: Dathan,
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-03-06 15:43:31

Lub, użyj:

void function () {
...
} ()
 -3
Author: Agamemnus,
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
2014-03-27 18:30:40