Quelle est la différence entre "LexicalEnvironment" et "VariableEnvironment" dans la spécification

Je lis la spécification ECMAScript 2015 , et les termes "LexicalEnvironment" et "VariableEnvironment" sont utilisés à plusieurs reprises. Ils sont définis dans le tableau 23:

LexicalEnvironment: identifie l'environnement Lexique utilisé pour résoudre les références d'identifiant faites par le code dans ce contexte d'exécution.

VariableEnvironnement: identifie l'environnement Lexique dont EnvironmentRecord contient des liaisons créées par VariableStatements dans ce contexte d'exécution.

Les composants LexicalEnvironment et VariableEnvironnement d'un contexte d'exécution sont toujours des environnements Lexiques . Lorsqu'un contexte d'exécution est créé, ses composants LexicalEnvironment et VariableEnvironment ont initialement la même valeur .

Alors, je veux savoir comment ils seront différents, et quelles situations chacun est utilisé. Quelqu'un pourrait-il expliquer?

C'est difficile. J'essaierai d'expliquer quelques exemples simples. Donc, une chose importante, dans cette question, c'est aussi de comprendre le execution context .

Environnement Lexique

Les moyens d'écrire quelque chose dans le code sont importants. Toutes les langages de programmation ne sont pas similaires, mais javascript est.

Donc, si vous avez une fonction comme

 function hello() { var myVar = 'hello'; } 

Maintenant, la variable myVar trouve lélectivement dans la fonction. C'est physiquement le code que vous écrivez. En bref, si on parle d' lexical environment signifie où il est écrit et ce qui l'entoure.

Environnement variable Chaque fois que vous appelez une fonction, un nouveau contexte d'exécution sera créé. Donc même myVar est déclaré 3 fois (voir l'exemple suivant), ils ne se touchent pas. C'est à ce moment-là que vous parlez de l' Variable Environment

 function b() { var myVar; console.log('three', myVar) // three undefined // cause myVar is newly declared in b() // but has no value } function a() { var myVar = 2; console.log('two', myVar) // two 2 b(); } var myVar = 1; console.log('one', myVar) // one 1 a(); console.log('four', myVar) // one 1 

Je poste la question à l'organisation officielle ECMA262 sur github, c'est la réponse de littledan:

Un LexicalEnvironment est une portée lexicale locale, par exemple, pour les variables définies par let. Si vous définissez une variable avec let dans un bloc de capture, il est seulement visible dans le bloc de capture, et pour implémenter cela dans les spécifications, nous utilisons un LexicalEnvironment. VariableEnvironment est la portée de choses comme les variables var-defined. On peut penser à des «haussements» au sommet de la fonction. Pour implémenter cela dans la spécification, nous donnons aux fonctions un nouvel environnement variable, mais disons que les blocs héritent de VariableEnvironment.