2012-04-11 9 views
6

javascriptwindow est l'objet global, ce qui signifie que chaque objet de la portée globale est un enfant de window. Alors, pourquoi je reçois ce résultat:RéférenceErreur et objet global

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

Fiddle

Ces deux lignes doivent être les mêmes, devraient-ils pas?

Répondre

17

Parce qu'avec window.foo vous recherchez explicitement la propriété foo de window objet qui n'est pas le cas dans cette dernière option. Dans cette dernière option, si foo n'est pas défini, vous devez être en mesure de savoir que le développeur n'est pas défini et obtenir l'avertissement d'erreur claire plutôt que l'interpréteur en le réglant sur undefined seul (comme le premier cas) qui conduira inattendu résultats.

Reference Error:

Représente une erreur lorsqu'une variable inexistante est référencé. Une erreur ReferenceError est renvoyée lorsque vous essayez de déréférencer une variable qui n'a pas été déclarée.

Jetez un oeil à cet article pour plus d'informations:

Je cite ci-dessus article:

Une référence est considérée comme impossible à résoudre si sa valeur de base est indéfini. Par conséquent, une référence de propriété n'est pas résolue si la valeur avant le point est indéfinie. L'exemple suivant lancerait une erreur ReferenceError mais pas parce que TypeError y arrivera en premier. Cela est dû au fait que la valeur de base d'une propriété est soumise à CheckObjectCoercible (ECMA 5 9.10 via 11.2.1) qui lance une erreur TypeError lors de la tentative de conversion d'un type indéfini en objet.

Exemples:

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

Références qui ne sont ni propriétés ou variables sont, par définition, impossible à résoudre et jetteront un ReferenceError, donc:

foo; //ReferenceError 
2

Dans votre premier exemple (window.foo) vous accédez à une propriété de l'objet window. JavaScript renvoie "indéfini" lorsque vous tentez d'accéder à une propriété inexistante d'un objet. C'est conçu de cette façon.

Dans le deuxième exemple, vous référencez directement une variable et, comme elle n'existe pas, une erreur est générée.

C'est exactement la façon dont JavaScript est conçu et fonctionne.

1

En JavaScript, vous pouvez assigner champs d'objets à la volée comme ça, donc window.foo est presque ( équivalent à var foo;lorsqu'il est défini dans le contexte global, alors qu'appeler foo hors du bleu rend le navigateur panique parce qu'il ne sait même pas quel objet regarder. Avis, si vous faites:

//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' n'est pas équivalent à' var foo'. –

+0

@TimDown. pouvez-vous élaborer un peu plus s'il vous plaît? peut-être dans une réponse? – gdoron

+0

@TimDown & @ gdoron Bon, c'est un peu faux - ce que je voulais dire, c'est que window.foo est équivalent à 'var foo' lorsqu'il est déclaré dans le contexte global. – JKing