2012-04-11 16 views
6

W javascriptwindow to globalny obiekt, co oznacza, że ​​każdy przedmiot w zasięgu globalnym jest dzieckiem window. Więc dlaczego mam ten wynik:ReferenceError i globalny obiekt

console.log(window.foo); // No error, logs "undefined". 
console.log(foo);  // Uncaught ReferenceError: foo is not defined. 

Fiddle

Te dwie linie powinny być takie same, nie powinny one?

Odpowiedz

17

Ponieważ z window.foo wyraźnie poszukujesz foo właściwości obiektu window, co nie ma miejsca w przypadku drugiej opcji. W tej drugiej opcji, jeśli foo nie jest zdefiniowany, powinieneś jako deweloper wiedzieć, że nie jest on zdefiniowany i otrzymać jednoznaczne ostrzeżenie o błędzie, a nie interpreter ustawiając go na undefined sam (jak pierwszy przypadek), który będzie prowadził do nieoczekiwanych wyników.

Reference Error:

reprezentuje błąd, gdy zmienna nieistniejące odwołuje. Wywołanie ReferenceError jest zgłaszane podczas próby wyodrębnienia zmiennej, która nie została zadeklarowana.

Spójrz na ten artykuł, aby uzyskać więcej informacji:

Cytując powyższy artykuł:

mowa jest uważany nierozwiązywalne jeśli jego wartość bazowa jest niezdefiniowany. Dlatego odniesienie do właściwości jest nierozwiązywalne, jeśli wartość przed kropką jest niezdefiniowana. Poniższy przykład powodowałby błąd ReferenceError, ale nie wynika z tego, że TypeError dostanie się tam jako pierwszy. Wynika to z faktu, że podstawowa wartość właściwości podlega CheckObjectCoetable (ECMA 5 9.10 do 11.2.1), która wyrzuca TypeError przy próbie przekształcenia niezdefiniowanego typu w obiekt.

Przykłady:

var foo; 
foo.bar; //TypeError (base value, foo, is undefined) 
bar.baz; //ReferenceError (bar is unersolvable) 
undefined.foo; //TypeError (base value is undefined) 

Odniesienia, które nie są ani właściwości lub zmienne są z definicji nierozwiązywalne i rzuci ReferenceError, So:

foo; //ReferenceError 
2

W pierwszym przykładzie (window.foo) uzyskujesz dostęp do właściwości obiektu window. JavaScript zwraca "niezdefiniowane", gdy próbujesz uzyskać dostęp do nieistniejącej właściwości obiektu. Jest zaprojektowany w ten sposób.

W drugim przykładzie odwołujesz się bezpośrednio do zmiennej, a ponieważ nie istnieje, pojawia się błąd.

To po prostu sposób, w jaki JavaScript jest zaprojektowany i działa.

1

W JavaScript można przypisać pola obiektów w locie w ten sposób, więc window.foo jest prawie równy (patrz komentarze poniżej) odpowiednik var foo;, gdy jest zdefiniowany w kontekście globalnym,, podczas gdy samo wywoływanie foo z niebieskiej powoduje panikę w przeglądarce, ponieważ nie wie nawet, który obiekt ma wyglądać. Zauważ, jeśli to zrobisz:

//when in global context, 'var' sets a property on the window object 
var foo; 

console.log(foo); 
//it will then also log `undefined` instead of throwing the error. 

//if you then do: 
foo = "abbazabba"; 

console.log(window.foo); 
// it will return "abbazabba" 
+1

'window.foo' nie jest równoważne' var foo'. –

+0

@TimDown. czy możesz jeszcze trochę więcej rozwinąć? może w odpowiedzi? – gdoron

+0

@TimDown & @gdoron Okay, to trochę nieprawda - chodziło mi o to, że window.foo jest równoważne 'var foo', gdy jest zadeklarowane w kontekście globalnym. – JKing