Załóżmy, że mamy kod, który jest używany do inicjalizacji rzeczy po załadowaniu strony i wygląda następująco:
function initStuff() { ...}
...
$(document).ready(initStuff);
Funkcja initStuff jest wywoływana tylko z trzeciego wiersza fragmentu kodu. Nigdy więcej. Zwykle ludzie umieszczają to w anonimowym wywołaniu zwrotnym:
$(document).ready(function() {
//Body of initStuff
});
Posiadanie funkcji w dedykowanym miejscu w kodzie tak naprawdę nie pomaga w czytelności, ponieważ wywołanie ready () pokazuje, że jest to kod inicjujący.
Czy są jakieś inne powody, aby preferować jeden od drugiego?
coding-style
jquery
Martin N.
źródło
źródło
Odpowiedzi:
Jak wspomniano @ Stargazer712, pierwszy zaśmieca globalną przestrzeń nazw, więc drugi to zwycięzca IMHO. Teraz, powiedziawszy to, ponieważ używasz anonimowej funkcji w drugim przykładzie, callstack twojego debuggera będzie bezużyteczny i uzyska różne wyniki w zależności od używanego debuggera. Zwykle tym, co ostatecznie kończę, jest:
W ten sposób globalna przestrzeń nazw nie jest zagracona, a Ty masz przydatny stos wywołań.
Mam tendencję do używania powyższej konwencji we wszystkich anonimowych (no, już nie anonimowych) definicjach funkcji. To konwencja, którą znalazłem podczas przeglądania kodu JS Firefoksa.
Edycja: Powiedziawszy to wszystko, Oliver porusza kwestię testów jednostkowych. Powyższe ma działać jako opakowanie dla bardziej złożonych operacji, a nie pomieścić masę nieprzetestowanego kodu.
źródło
Powiedziałbym, że w tym przypadku prawdopodobnie nie ma to znaczenia, ale jeśli masz anonimowe funkcje zwrotne, wywołujące inne anonimowe funkcje zwrotne, zwykle używam pierwszego podejścia, ponieważ sprawia, że kod jest znacznie bardziej czytelny i łatwiejszy do śledzenia.
Jeśli chodzi o testowanie jednostkowe, pierwsze podejście byłoby lepsze, ponieważ można by przetestować
initstuff
funkcję w izolacji.źródło
Chciałbym wybrać pierwszy, dla czytelności / debugowania / testowania itp. Możesz uniknąć problemu zaśmiecania globalnej przestrzeni nazw, po prostu tworząc lokalną przestrzeń nazw dla wszystkich funkcji na twojej stronie. Używam stylu notacji obiektowej, zgodnie z zaleceniami Paula Irisha (patrz slajdy 13-15 na http://paulirish.com/2009/perf/ )
źródło
Istnieje również trzeci sposób rejestrowania metod inicjowania bez zaśmiecania globalnej przestrzeni nazw, którą preferuję:
Jest krótki i pozwala uniknąć wyszukiwania dokumentów DOM
robi.
źródło
$
, wolę:jQuery(function($) {...});