Czy kiedykolwiek zajrzałeś pod maskę kodu źródłowego jQuery 1.4 i zauważyłeś, jak jest on hermetyzowany w następujący sposób:
(function( window, undefined ) {
//All the JQuery code here
...
})(window);
Przeczytałem artykuł na temat przestrzeni nazw JavaScript i kolejny zatytułowany „ Ważna para parenów ”, więc wiem trochę o tym, co się tutaj dzieje.
Ale nigdy wcześniej nie widziałem tej konkretnej składni. Co to undefined
tam robi? I dlaczego window
trzeba go przekazać, a potem znowu pojawić się na końcu?
javascript
jquery
syntax
dkinzer
źródło
źródło
Odpowiedzi:
Niezdefiniowana jest normalną zmienną i można ją po prostu zmienić za pomocą
undefined = "new value";
. Zatem jQuery tworzy lokalną zmienną „niezdefiniowaną”, która jest NAPRAWDĘ niezdefiniowana.Ze względu na wydajność zmienna okna jest lokalna. Ponieważ kiedy JavaScript wyszukuje zmienną, najpierw przechodzi przez zmienne lokalne, aż znajdzie nazwę zmiennej. Jeśli nie zostanie znaleziony, JavaScript przechodzi przez następny zakres itp., Aż przefiltruje zmienne globalne. Więc jeśli zmienna okna jest lokalna, JavaScript może ją szybciej wyszukać. Dalsze informacje: Przyspiesz swój JavaScript - Nicholas C. Zakas
źródło
Nieokreślony
Deklarując
undefined
jako argument, ale nigdy nie przekazując mu wartości, zapewnia, że jest ona zawsze niezdefiniowana, ponieważ jest to po prostu zmienna w zakresie globalnym, którą można nadpisać. Jesta === undefined
to bezpieczna alternatywa dlatypeof a == 'undefined'
, która oszczędza kilka znaków. Dzięki temu kod jest bardziej przyjazny minifier, coundefined
można skrócić,u
na przykład, do zapisania kilku dodatkowych znaków.Okno
Podanie
window
jako argument powoduje zachowanie kopii w zakresie lokalnym, co wpływa na wydajność: http://jsperf.com/short-scope . Wszystkie dostępywindow
będą teraz musiały przejść o jeden poziom mniej w górę łańcucha lunety. Podobnie jak wundefined
przypadku lokalnej kopii ponownie umożliwia bardziej agresywną minifikację.Dygresja:
Chociaż może nie być to intencją twórców jQuery, przekazanie
window
umożliwia łatwiejszą integrację biblioteki w środowiskach JavaScript po stronie serwera, na przykład node.js - gdzie nie mawindow
obiektu globalnego . W takiej sytuacji wystarczy zmienić tylko jedną linię, aby zastąpićwindow
obiekt innym. W przypadku jQuery można stworzyć pozorowanywindow
obiekt i przekazać go w celu skrobania HTML ( może to zrobić biblioteka taka jak jsdom ).źródło
(function(a,b){})(window);
-a
ib
są znacznie krótsze niżwindow
aundefined
:)Inni wyjaśnili
undefined
.undefined
jest jak zmienna globalna, którą można przedefiniować na dowolną wartość. Ta technika ma na celu zapobieżenie zerwaniu wszystkich niezdefiniowanych sprawdzeń, jeśli ktośundefined = 10
gdzieś napisał . Argument, który nigdy nie zostanie przekazany, ma gwarancję, że jest prawdziwy,undefined
niezależnie od wartości zmiennejundefined
.Powód przejścia przez okno można zilustrować na następującym przykładzie.
Co rejestruje konsola? Wartość
window
przedmiotu, prawda? Źle! 10? Źle! To rejestrujeundefined
. Interpreter JavaScript (lub kompilator JIT) przepisuje to w ten sposób -Jeśli jednak otrzymasz
window
zmienną jako argument, nie ma zmiennej, a zatem nie ma niespodzianek.Nie wiem, czy jQuery to robi, ale jeśli redefiniujesz
window
zmienną lokalną w dowolnym miejscu funkcji z jakiegokolwiek powodu, dobrym pomysłem jest pożyczenie jej z zakresu globalnego.źródło
window
jest przekazywany w ten sposób na wypadek, gdyby ktoś zdecydował się na przedefiniowanie obiektu okna w IE, zakładam to samoundefined
, na wypadek, gdyby później został ponownie przypisany.Wierzchołek
window
tego skryptu to po prostu nazwanie argumentu „okno”, argument, który jest bardziej lokalny niżwindow
odniesienie globalne i to, czego użyje kod wewnątrz tego zamknięcia. Nawindow
końcu tak naprawdę określa się, co przekazać dla pierwszego argumentu, w tym przypadku obecne znaczeniewindow
... mam nadzieję, że nie schrzaniłeś,window
zanim to się stanie.Łatwiej o tym pomyśleć, pokazując najbardziej typowy przypadek używany w jQuery,
.noConflict()
obsługę wtyczek , więc dla większości kodu możesz nadal używać$
, nawet jeśli oznacza to coś innego niżjQuery
poza tym zakresem:źródło
Przetestowano na 1000000 iteracji. Taka lokalizacja nie miała wpływu na wydajność. Ani jednej milisekundy w 1000000 iteracjach. To jest po prostu bezużyteczne.
źródło
window
możesz zobaczyć jakiś zysk dzięki lokalnej kopii.