Istnieje opcja JSLint , jedna z dobrych części, która „[wymaga] powiązań wokół natychmiastowych wywołań”, co oznacza, że konstrukcja
(function () {
// ...
})();
zamiast tego musiałby być zapisany jako
(function () {
// ...
}());
Moje pytanie jest takie - czy ktoś może wyjaśnić, dlaczego tę drugą formę można uznać za lepszą? Czy jest bardziej odporny? Mniej podatne na błędy? Jaką ma przewagę nad pierwszą formą?
Odkąd zadałem to pytanie, zrozumiałem, jak ważne jest wyraźne wizualne rozróżnienie 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ć peryferyjne nawiasy są składniowo niepotrzebne, nawiasem otwierającym daje wskazanie up-front, że wartość jest przyporządkowana jest nie sama funkcja, ale raczej wynikiem funkcji jest wywoływany.
Jest to podobne do rady Crockforda dotyczącej kapitalizacji funkcji konstruktora - ma służyć jako wizualna wskazówka dla każdego, kto patrzy na kod źródłowy.
źródło
Odpowiedzi:
Z przewodnika po konwencjach stylu Douglassa Crockforda : (wyszukaj „wywołane natychmiast”)
Gdy funkcja ma zostać wywołana natychmiast, całe wyrażenie wywołania powinno być opakowane w pareny, aby było jasne, że tworzona wartość jest wynikiem funkcji, a nie samej funkcji.
Zasadniczo uważa więc, że wyjaśnia to rozróżnienie między wartościami funkcji a wartościami funkcji. Jest to więc kwestia stylistyczna, a nie istotna różnica w samym kodzie.
zaktualizowane odniesienie, stary plik PPT już nie istnieje
źródło
Natychmiast zwane funkcje anonimowe są opakowane w pareny, ponieważ:
Są to wyrażenia funkcyjne i pozostawienie parenów na zewnątrz spowodowałoby zinterpretowanie ich jako deklaracji funkcji, która jest błędem składniowym.
Wyrażenia funkcyjne nie mogą zaczynać się od słowa function.
Podczas przypisywania wyrażenia funkcyjnego do zmiennej, sama funkcja nie jest zwracana, zwracana jest wartość zwracana funkcji
, stąd pareny oceniają, co jest w środku i wytwarzają wartość.gdy funkcja jest wykonywana, a końcowe pareny..}()
powodują natychmiastowe wykonanie funkcji.źródło
Albo użyj:
źródło