2012-03-07 29 views
56

Zauważyłem jQuery i pokrewnych się wystąpienia wtyczek jak jQuery.UI przejściu undefined jako parametr do anonimowych funkcji używanych w ich definicji modułu, tak jak poniżej:Jaki jest cel przejścia niezdefiniowanego?

(function($, undefined) { ... })(jQuery); 

Alternatywnie, zauważyłem inne wtyczki zalecane przez jQuery i/lub innych NIE przekazuj niezdefiniowanego jako parametru.

Prawdopodobnie jest to głupie pytanie, ale ...

nie powinien być zawsze dostępny w każdym razie? Po co to przekazywać? Czy dzieje się tu jakiś inny cel lub sztuczka?

Odpowiedz

68

Istnieją dwa powody:

1) Jeżeli undefined jest zmienna w zakresie funkcji, zamiast globalnej właściwości obiektu, minifiers można sprowadzić do jednej litery w ten sposób osiągnięcie lepszego stopnia kompresji.

2) Przed wersją ES5 *, undefined była własnością obiektu globalnego bez ochrony przed zapisem. Może to być nadpisane, powodując dziwne i nieoczekiwane zachowanie. Można zrobić coś takiego:

var test = 123; 
undefined = 123; 
if (test === undefined){ 
    // this will actually be true, since undefined now equals 123 
} 

Poprzez argument funkcji undefined (nazwa rzeczywiście nie ma znaczenia), które nie przechodzą parametr aby można było upewnić się, że masz zmienną, która naprawdę jest undefined aby przetestować "niezdefiniowaną" względem tej zmiennej.

Przy okazji.najbezpieczniejsza metoda testowania jest niezdefiniowany: typeof (var) === 'undefined'

(*) Z ECMAScript 5, właściwości globalnych undefined, NaN i Infinity stał tylko do odczytu. Tak więc wraz z jego ogólnym przyjęciem we wszystkich nowoczesnych przeglądarkach - oczywiście z wyjątkiem IE 9 - nadpisanie tych wartości nie było już możliwe.

+5

Powodem, dla którego jQuery używa tej metody zamiast 'typeof' jest to, że kompresuje ona znacznie lepiej w miniurze Javascript. – interjay

+1

To prawda, jednak najbezpieczniejsza jest metoda typeof. Możesz także użyć nieokreślonej natury falsji, która byłaby najkrótszym sprawdzianem dla 'niezdefiniowanej ', ale jest zacieniona przez istnienie innych wartości fałszerstw. – Christoph

16

Robi się to, aby upewnić się, że undefined zawsze jest undefined. W starszych wersjach specyfikacji ECMAScript (przed ECMAScript 5) niezdefiniowane nie było słowem zastrzeżonym, lecz zwykłą zmienną. W starszych przeglądarek będzie to mieć na przykład:

undefined = 2; // Assign a different value to undefined 

// Now this statement would be true 
if (undefined == 2) 

Tak, aby upewnić się, że niezdefiniowane w rzeczywistości jest niezdefiniowane, nawet jeśli jakiś inny „zło” scenariusz byłby przeniesiony niezdefiniowane z inną wartością, należy utworzyć parametr, który call undefined, a następnie, gdy wywołujesz funkcję, upewnij się, że nie przekazujesz wartości do tego parametru - możesz więc być pewnym, że zmienna undefined będzie zawsze niezdefiniowana w twojej funkcji.

Tak więc w przypadku jQuery:

(function($, undefined) { ... })(jQuery); 

przechodzą one w jQuery i przypisać ją do zmiennej $ dla wygody, ale potem nie przechodzą drugą wartość parametru nieokreślonego, co nieokreślone woli być niezdefiniowanym.

Nowoczesne przeglądarki

W nowoczesnych przeglądarek undefined jest non-konfigurowalny, bez zapisu nieruchomość za tym ECMAScript 5 specification.

10

undefined nie jest słowem zastrzeżonym w javascript, jest po prostu zmienną. jQuery zapewnia, że ​​jeśli jakiś zły programista nadpisze wartość undefined w swoim javascript, jQuery zignoruje go i ustali jego własną zmienną, niezdefiniowaną, która nigdy nie jest przekazywana przez wartość (patrz samo-wykonywanie (jQuery) na końcu) i jest zatem nieokreślony.