Quelle est la portée des variables en JavaScript ?
Quelle est la portée des variables en javascript ? Ont-ils la même portée à l'intérieur qu'à l'extérieur d'une fonction ? Ou est-ce même important? De plus, où sont stockées les variables si elles sont définies globalement ?
Solution du problème
TLDR
JavaScript a une portée et des fermetures lexicales (également appelées statiques). Cela signifie que vous pouvez déterminer la portée d'un identifiant en consultant le code source.
Les quatre périmètres sont:
En dehors des cas particuliers de portée globale et de module, les variables sont déclarées à l'aide de var
(portée de la fonction), let
(portée du bloc) et const
(portée du bloc). La plupart des autres formes de déclaration d'identifiant ont une portée de bloc en mode strict.
Aperçu
La portée est la région de la base de code sur laquelle un identifiant est valide.
Un environnement lexical est une correspondance entre les noms d'identificateurs et les valeurs qui leur sont associées.
La portée est formée d'une imbrication liée d'environnements lexicaux, chaque niveau de l'imbrication correspondant à un environnement lexical d'un contexte d'exécution ancêtre.
Ces environnements lexicaux liés forment une « chaîne » de portée. La résolution d'identifiant est le processus de recherche le long de cette chaîne d'un identifiant correspondant.
La résolution de l'identifiant ne se produit que dans un sens : vers l'extérieur. De cette façon, les environnements lexicaux externes ne peuvent pas "voir" dans les environnements lexicaux internes.
Il existe trois facteurs pertinents pour décider de la portée d'un identifiant en JavaScript :
Certaines des façons dont les identifiants peuvent être déclarés :
var
, let
etconst
var
en mode non strict)import
déclarationseval
Certains des identifiants de lieux peuvent être déclarés :
Styles de déclaration
a été
Les identifiants déclarés à l'aide var
de ont une portée de fonction, sauf lorsqu'ils sont déclarés directement dans le contexte global, auquel cas ils sont ajoutés en tant que propriétés sur l'objet global et ont une portée globale. Il existe des règles distinctes pour leur utilisation dans eval
les fonctions.
laisser et const
Les identifiants déclarés à l'aide de let
et const
ont une portée de bloc, sauf lorsqu'ils sont déclarés directement dans le contexte global, auquel cas ils ont une portée globale.
Remarque: let
, const
et var
sont tous hissés. Cela signifie que leur position logique de définition est le sommet de leur portée englobante (bloc ou fonction). Cependant, les variables déclarées à l'aide de let
et const
ne peuvent pas être lues ou affectées tant que control n'a pas dépassé le point de déclaration dans le code source. La période intermédiaire est connue sous le nom de zone morte temporelle.
function f() {
function g() {
console.log(x)
}
let x = 1
g()
}
f() // 1 because x is hoisted even though declared with `let`!
Commentaires
Enregistrer un commentaire