Je veux savoir ce qu'est l'objet global en JavaScript et à quelle classe cet objet appartient.
Et comment sont Infinity
, NaN
y undefined
fait partie de l'objet global ?
Je veux savoir ce qu'est l'objet global en JavaScript et à quelle classe cet objet appartient.
Et comment sont Infinity
, NaN
y undefined
fait partie de l'objet global ?
La portée des variables est définie en JavaScript par une fonction, et les fonctions peuvent être imbriquées dans d'autres fonctions.
function foo() {
// new variable scope in here
var a = "a";
function bar() {
// another nested variable scope
var b = "b";
}
bar();
}
foo();
SAUF qu'il existe une portée de variable "globale" par défaut qui est définie lors de l'exécution de votre programme. Il s'agit de la variable de base dans laquelle toutes les variables créées par les fonctions sont imbriquées.
Et alors ?
Eh bien, chaque variable a un objet variable (ou plus exactement, un objet "liant") . C'est un objet interne auquel sont liées toutes les variables locales que vous créez.
Cet objet variable n'est pas directement accessible. Vous ne pouvez lui ajouter des propriétés qu'en déclarant une variable locale (ou paramètre de fonction, ou déclaration de fonction) . Et vous ne pouvez accéder aux propriétés que par le biais des noms de variables.
Encore une fois, et alors ?
La portée de la variable "globale" est unique. Elle est expose cet objet variable interne en définissant automatiquement une propriété sur l'objet qui renvoie à l'objet lui-même. Dans un navigateur, cette propriété s'appelle window
.
Parce qu'une propriété est placée sur l'objet qui renvoie à l'objet, et parce que les propriétés de l'objet deviennent des variables, nous avons maintenant un accès direct à l'objet variable global.
Vous pouvez tester cela en observant que le window.window
est une référence égale à la propriété window
variable.
alert(window.window === window); // true
En conséquence, nous pouvons ajouter une propriété à l'objet window.foo = "bar";
et il apparaît comme une variable globale alert(foo); // "bar"
.
Notez que la seule portée de variable qui expose cet objet interne est la portée globale. Aucun des scopes de fonction ne l'expose.
Notez également que la spécification ECMAScript ne permet pas exiger que l'objet variable global soit exposé. C'est à l'implémentation de décider.
Il n'y a pas de vraies classes, mais si vous voulez dire la chaîne de prototypes de l'objet global, la spécification ne dit pas grand chose :
Les valeurs des propriétés internes [[Prototype]] et [[Classe]] de l'objet global dépendent de l'implémentation.
([[Classe]] est utilisé dans par exemple window.toString()
afin que vous puissiez obtenir "[object global]"
.)
Les trois valeurs que vous mentionnez sont des propriétés de l'objet global, par exemple :
Infinity === window.Infinity; // true (in a browser the global object is window)
Vous ne pouvez pas écraser ces variables, vous pouvez donc les considérer comme des littéraux. Mais en réalité, elles sont des propriétés de l'objet global, et vous pouvez donc vous y référer en tant que variables ("variables globales").
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.