javascript - yyyy - Est-ce que les instructions let créent des propriétés sur l'objet global?




opération sur les dates javascript (4)

Est-ce let instructions let créent des propriétés sur l'objet global?

Selon les spec , non:

Un enregistrement d'environnement global est logiquement un enregistrement unique mais il est spécifié en tant que composite encapsulant un enregistrement d'environnement d'objet et un enregistrement d'environnement déclaratif . L' enregistrement d'environnement d'objet a pour objet de base l'objet global du domaine associé. Cet objet global est la valeur renvoyée par la méthode concrète GetThisBinding l'enregistrement GetThisBinding . Le composant d'enregistrement d'environnement d'objet d'un enregistrement d'environnement global contient les liaisons de tous les globals intégrés ( Realm ) et de toutes les liaisons introduites par un FunctionDeclaration , un GeneratorDeclaration ou un VariableStatement contenu dans le code global. Les liaisons pour toutes les autres déclarations ECMAScript en code global sont contenues dans le composant enregistrement d'environnement déclaratif de l'enregistrement d'environnement global.

Quelques explications supplémentaires:

  • Un enregistrement d'environnement déclaratif stocke les liaisons dans une structure de données interne. Il est impossible de mettre la main sur cette structure de données de quelque manière que ce soit (pensez à la portée des fonctions).

  • Un enregistrement d'environnement d' objet utilise un objet JS réel en tant que structure de données. Chaque propriété de l'objet devient une liaison et vice versa. L'environnement global a un objet environnement d'objet dont "objet de liaison" est l'objet global. Un autre exemple est with .

Désormais, comme l'indique la pièce citée, seuls FunctionDeclaration , GeneratorDeclaration et VariableStatement créent des liaisons dans l'enregistrement d'environnement de l' objet de l'environnement global. C'est-à-dire que seules ces liaisons deviennent des propriétés de l'objet global.

Toutes les autres déclarations (par exemple, const et let ) sont stockées dans l'enregistrement d'environnement déclaratif de l'environnement global, qui n'est pas basé sur l'objet global.

https://code.i-harness.com

En JavaScript, les déclarations var créent des propriétés sur l'objet global:

var x = 15;
console.log(window.x); // logs 15 in browser
console.log(global.x); // logs 15 in Node.js

ES6 introduit la portée lexicale avec des déclarations let ayant une portée de bloc.

let x = 15;
{
   let x = 14;
}
console.log(x); // logs 15;

Cependant, ces déclarations créent-elles des propriétés sur l'objet global?

let x = 15;
// what is this supposed to log in the browser according to ES6?
console.log(window.x); // 15 in Firefox
console.log(global.x); // undefined in Node.js with flag

Les variables let et var , si elles sont déclarées au niveau supérieur d'un script, sont accessibles en dehors du fichier de script. Cependant, seules les variables var sont assignées à l'objet window . Regardez l'extrait de code comme preuve:

<script>
  var namedWithVar = "with var";
  let namedWithLet = "with let";
</script>

<script>
  console.log("Accessed directly:");
  console.log(namedWithVar);        // prints: with var
  console.log(namedWithLet);        // prints: with let
  console.log("");

  console.log("Accessed through window:");
  console.log(window.namedWithVar); // prints: with var
  console.log(window.namedWithLet); // prints: undefined
</script>


Selon les spécifications :

"Les déclarations let et const définissent des variables qui sont étendues au LexicalEnvironment du contexte d’exécution en cours."

Cela signifie que vous devriez pouvoir accéder à la variable à l'intérieur de la portée d'exécution, mais pas à l'extérieur. Cela étend la portée de l'exécution au-delà de la structure de fermeture JS classique, fonctionnelle ou globale.

Définir une variable let globalement laisse cette possibilité d'interprétation, comme vous le voyez dans Firefox, elle lie une variable globale alors que V8 / iojs ne le fait pas.

Il est à noter que console.log(typeof x) retournera un number dans iojs. En pratique, vous ne devez pas définir autant que possible des variables en dehors des modules ou des fonctions ... surtout avec const et let


let vous permet de déclarer des variables dont la portée est limitée au bloc, à l'instruction ou à l'expression sur lequel elles sont utilisées. Cela diffère du mot-clé var , qui définit une variable globalement ou localement à une fonction entière, quelle que soit la portée du bloc.

Au niveau supérieur des programmes et des fonctions, let, contrairement à var, ne crée pas de propriété sur l'objet global. Par exemple:

   var x = 'global';
   let y = 'global';
   console.log(this.x); // "global"
   console.log(this.y); // undefined

La portée d'une variable déclarée avec var correspond à son contexte d'exécution actuel, qui est la fonction englobante ou, pour les variables déclarées en dehors de toute fonction, global. Si vous re-déclarez une variable JavaScript, elle ne perdra pas sa valeur. Par exemple:

var x = 1;

if (x === 1) {
  var x = 2;

  console.log(x);
  // output: 2
}

console.log(x);
// output: 2

Remarque: contrairement à C , C ++ et Java , JavaScript n'a pas de portée au niveau du bloc lorsque vous déclarez une variable à l'aide de var .

Comme nous l'avons mentionné précédemment, let vous permet de déclarer des variables dont la portée est limitée au bloc, à l'instruction ou à l'expression sur laquelle elles sont utilisées. Par exemple:

let x = 1;

if (x === 1) {
  let x = 2;

  console.log(x);
  // output: 2
}

console.log(x);
// output: 1

Ici, je vous recommande de lire à propos de la portée variable







let