Maison > Questions et réponses > le corps du texte
P粉5462579132023-08-22 12:41:43
Javascript utilise des chaînes de portée pour déterminer la portée d'une fonction donnée. Il existe généralement une portée globale et chaque fonction définie a sa propre portée imbriquée. Toute fonction définie dans une autre fonction a une portée locale liée à la fonction externe. Il s'agit toujours de l'emplacement du code source où la portée est définie.
Un élément dans une chaîne de portées est essentiellement une carte avec un pointeur vers sa portée parent.
Lors de l'analyse des variables, JavaScript part de la portée la plus interne et recherche vers l'extérieur.
P粉1655228862023-08-22 10:58:25
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 examinant le code source.
Les quatre périmètres sont les suivants :
Sauf les cas particuliers de portée globale et de module, les variables sont déclarées en utilisant var
(函数作用域)、let
(块作用域)和const
(portée de bloc). En mode strict, la plupart des autres formes de déclarations d'identifiant ont une portée de bloc.
Scope est la zone de la base de code où l'identifiant est valide.
L'environnement lexical est le mappage entre les noms d'identifiants et les valeurs qui leur sont associées.
Une portée est formée par une imbrication liée d'environnements lexicaux, chaque niveau d'imbrication correspondant à l'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 tout au long de cette chaîne d'un identifiant correspondant.
La résolution des identifiants se fera uniquement vers l'extérieur. De cette façon, l’environnement lexical externe ne peut pas « voir » l’environnement lexical interne.
Il y a trois facteurs pertinents pour décider de la portée des identifiants en JavaScript :
Quelques façons de déclarer les identifiants :
var
,let
和const
var
en mode non strict) import
Déclarationeval
Localisation de déclaration de certains identifiants :
Les identifiants var
声明的标识符具有函数作用域,除非它们直接在全局上下文中声明,此时它们将作为全局对象的属性添加,并具有全局作用域。它们在eval
déclarés à l'aide de
let
和const
let et const
Les identifiants
Remarque : let
,const
和var
都被提升。这意味着它们的逻辑定义位置是其封闭作用域(块或函数)的顶部。但是,使用let
和const
Les variables déclarées ne peuvent pas être lues ou attribuées tant que le flux de contrôle n'a pas traversé le point de déclaration dans le code source. Cette période temporaire est appelée zone morte temporaire.
function f() { function g() { console.log(x) } let x = 1 g() } f() // 1 because x is hoisted even though declared with `let`!