2012-04-11 7 views
6

In javascriptwindow ist das globale Objekt, was bedeutet, dass jedes Objekt im globalen Bereich ein Kind von window ist. Also, warum bekomme ich dieses Ergebnis:ReferenceError und das globale Objekt

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

Fiddle

Diese beiden Linien sollten die gleichen sein, sollten sie nicht?

Antwort

17

Da mit window.foo Sie explizit nach foo Eigenschaft von window Objekt suchen, was nicht der Fall in der letzteren Option ist. Wenn in der letzten Option foo nicht definiert ist, sollten Sie als Entwickler wissen, dass es nicht definiert ist, und die Fehlerwarnung erhalten, anstatt den Interpreter selbst auf undefined zu setzen (wie im ersten Fall) zu unerwartet Ergebnisse.

Reference Error:

Repräsentiert einen Fehler, wenn ein nicht existierendes Variable verwiesen wird. Ein ReferenceError wird ausgelöst, wenn versucht wird, eine Variable zu dereferenzieren, die nicht deklariert wurde.

für weitere Informationen zu diesem Artikel Werfen Sie einen Blick:

von oben Artikel Zitiert:

A Referenz unresolvable betrachtet wird , wenn sein Wert Basis ist nicht definiert. Daher ist eine Eigenschaftsreferenz nicht lösbar, wenn der Wert vor dem Punkt nicht definiert ist. Das folgende Beispiel würde einen ReferenceError auslösen, aber nicht, weil TypeError zuerst dorthin gelangt. Dies liegt daran, dass der Basiswert einer Eigenschaft CheckObjectCoercible (ECMA 5 9.10 via 11.2.1) unterliegt, was beim Versuch, einen nicht definierten Typ in ein Objekt zu konvertieren, einen TypeError auslöst.

Beispiele:

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

Referenzen, die weder Eigenschaften oder Variablen sind per Definition nicht auflösbaren und wird eine Reference, So werfen:

foo; //ReferenceError 
2

In Ihrem ersten Beispiel (window.foo) greifen Sie auf eine Eigenschaft des Fensterobjekts zu. JavaScript gibt "undefined" zurück, wenn Sie versuchen, auf eine nicht vorhandene Eigenschaft eines Objekts zuzugreifen. Es ist so konzipiert.

Im zweiten Beispiel verweisen Sie direkt auf eine Variable, und da sie nicht existiert, wird ein Fehler ausgelöst.

Es ist genau so, wie JavaScript entworfen wurde und funktioniert.

1

In JavaScript kann nur vergeben Objektfelder im laufenden Betrieb so, so window.foo ist fast (siehe Kommentar unten) entsprechen var foo;wenn im globalen Kontext definiert, während nur foo aus heiterem Himmel Aufruf macht den Browser Panik, weil es down't auch wissen, welches Objekt in suchen Hinweis, wenn Sie das tun.

//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' ist nicht äquivalent zu' var foo'. –

+0

@TimDown. Kannst du bitte etwas mehr ausarbeiten? vielleicht in einer Antwort? – gdoron

+0

@TimDown & @gdoron Okay, das ist ein bisschen falsch - was ich meinte war window.foo ist äquivalent zu 'var foo', wenn es im globalen Kontext erklärt wird. – JKing