ReferenceError et l'objet global

Dans javascript window est l'objet global, ce qui signifie que chaque objet dans la portée globale est un enfant de la window . Alors, pourquoi obtenir ce résultat?

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

Violon

Ces deux lignes devraient être les mêmes, n'est-ce pas?

Parce qu'avec window.foo vous recherchez explicitement la propriété foo de l'objet window , ce qui n'est pas le cas dans la dernière option. Dans la dernière option, si foo n'est pas défini, vous devriez, en tant que développeur, savoir qu'il n'est pas défini et obtenir l'avertissement d'erreur clair plutôt que l'interprète en le définissant undefined seul (comme le premier cas) qui conduira À des résultats inattendus .

Erreur de référence :

Représente une erreur lorsqu'une variable inexistante est référencée. Un ReferenceError est lancé en essayant de désélectionner une variable qui n'a pas été déclarée.

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

  • Comprendre JavaScript 'indéfini'

Citant l'article ci-dessus:

Une référence est considérée comme non résolue si sa valeur de base est indéfinie . Par conséquent, une référence de propriété n'est pas résolue si la valeur avant le point n'est pas définie. L'exemple suivant jetterait ReferenceError mais ce n'est pas parce que TypeError est arrivé d'abord. C'est parce que la valeur de base d'une propriété est soumise à CheckObjectCoercible (ECMA 5 9.10 via 11.2.1) qui lance un TypeError lors de la tentative de convertir un type indéfini en un 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) 

Les références qui ne sont ni propriétés ni variables sont par définition non résolubles et jetteront ReferenceError, donc:

 foo; //ReferenceError 

Dans votre premier exemple (window.foo), vous accédez à une propriété de l'objet fenêtre. JavaScript renvoie "indéfini" pour 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 faites référence directement à une variable, et puisqu'il n'existe pas, une erreur est générée.

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

En JavaScript, vous pouvez attribuer des champs d'objet à la volée comme ça, de sorte que window.foo soit presque (voir les commentaires ci-dessous) équivalent à var foo; Lorsqu'elle est définie dans le contexte global, alors que l'appelant juste à l' foo un " foo fait de la panique la panique, car elle ne sait même pas quel objet rechercher. Remarquez, si vous le 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"