2013-10-11 12 views
14

Jeśli spróbuję odwołać się do nieistniejącej zmiennej, otrzymam ReferenceError w JavaScript. Dlaczego odwołanie się do nieistniejącej właściwości obiektu zwraca "niezdefiniowany"? Oto kod, pod warunkiem, piszę go w przeglądarce:dlaczego odwoływanie się do nieistniejącej właściwości obiektu w javascript nie zwróci błędu odniesienia?

alert(a); 
ReferenceError: a is not defined //error is thrown 
alert({}.a) 
undefined //no error 
+0

Czy możesz dodać kod? Gdybym był hazardzistą, powiedziałbym, że istnieje, ale jest albo pusty, albo pusty. Czy debugujesz za pomocą konsoli? –

+4

Pytasz, dlaczego ten język został zaprojektowany w ten sposób? @MikeHometchko - Wziąłbym twój zakład: nieistniejące właściwości zwracają 'undefined', podczas gdy właściwości które mają' null' zwracają 'null' (a jeśli przez" puste "masz na myśli pusty łańcuch, który powróci, cóż, pusta struna); aby jeszcze bardziej zagmatwać, właściwości, które istnieją, ale które zostały przypisane do wartości 'undefined' również zwracają' undefined'. – nnnnnn

+0

@nnnnnn Myślę, że on jest ... –

Odpowiedz

9

To właśnie, jak działa język. Podejście obiektowe jest bardzo elastyczne i można dynamicznie dodawać, aktualizować i usuwać właściwości z obiektów w środowisku wykonawczym. Uzyskanie dostępu do takiego, który obecnie nie istnieje, powinno spowodować wygenerowanie undefined zamiast zgłaszania wyjątku. Pozwala to na przykład na sprawdzenie istnienia i wpisanie pojedynczego wyrażenia:

if (prop in obj && typeof obj[prop] == "function") obj[prop](); 
// can be written shorter: 
if (typeof obj[prop] == "function") obj[prop](); 

Możesz uzyskać wartość bez jej używania. Użycie numeru undefined spowoduje odrzucenie większości sytuacji.

W przeciwieństwie do tego zmienne są zadeklarowane statycznie w swoim zakresie. Dostęp do niezadeklarowanej zmiennej to zawsze błąd, który uzasadnia rzucanie ReferenceError s.

+0

Dzięki, ale ja to wszystko wiem. Interesują mnie procesy "za kulisami", jak na przykład [dlaczego można usuwać właściwości niestandardowych obiektów za pomocą operatora 'delete' i nie można usuwać zmiennych i funkcji.] (Http://perfectionkills.com/porozumienie -delete /) –

+2

W tym celu polecam lekturę [specyfikacji ECMAScript] (http://ecma-international.org/ecma-262/5.1/), w szczególności w sekcjach 8.6, 8.7 i 8.12 na temat obiektów, 11.2 .1 i 11.4.1 dla operatorów, a może 10 [.2] na temat zmiennych i zakresów. Jednak specyfikacja nie wyjaśnia * dlaczego *, po prostu mówi * co *. – Bergi

+2

Należy zauważyć, że "ReferenceError" istnieje tylko w trybie ścisłym. Podsumowanie zmian w trybie ścisłym znajduje się w [Załącznik C] (http://www.ecma-international.org/ecma-262/5.1/#sec-C). Tryb ścisły ogranicza nierozwiązywalne odniesienia. Właściwości obiektu nie są nierozwiązywalnymi referencjami. –

Powiązane problemy