Lasciare che le istruzioni creino proprietà sull’object globale?

In JavaScript, le dichiarazioni var creano proprietà sull’object globale:

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

ES6 introduce lo scoping lessicale con let dichiarazioni che hanno scope block.

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

Tuttavia, queste dichiarazioni creano proprietà sull’object globale?

 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 

Lasciare let istruzioni creino proprietà sull’object globale?

Secondo le specifiche , no:

Un record di ambiente globale è logicamente un singolo record ma è specificato come un composito che incapsula un record di ambiente di object e un record di ambiente dichiarativo . Il record di ambiente dell’object ha come object base l’object globale del dominio associato. Questo object globale è il valore restituito dal metodo concreto GetThisBinding del record di ambiente globale. Il componente record dell’ambiente object di un record di ambiente globale contiene i binding per tutti i globali incorporati ( clausola 18 ) e tutti i binding introdotti da una FunctionDeclaration , GeneratorDeclaration o VariableStatement contenuta nel codice globale. I binding per tutte le altre dichiarazioni ECMAScript nel codice globale sono contenuti nel componente record dell’ambiente dichiarativo del record dell’ambiente globale.

Qualche altra spiegazione:

  • Un record di ambiente dichiarativo memorizza i binding in una struttura dati interna. È imansible ottenere una sospensione di tale struttura dati in qualsiasi modo (si pensi all’ambito della funzione).

  • Un record di ambiente dell’object utilizza un object JS effettivo come struttura dei dati. Ogni proprietà dell’object diventa vincolante e viceversa. L’ambiente globale ha un object ambiente object il cui “object vincolante” è l’object globale. Un altro esempio è with .

Ora, come afferma la parte citata, solo FunctionDeclaration s, GeneratorDeclaration s e VariableStatement s creano collegamenti nel record dell’ambiente dell’object dell’ambiente globale. Cioè solo questi binding diventano proprietà dell’object globale.

Tutte le altre dichiarazioni (ad es. const e let ) sono archiviate nel record dell’ambiente dichiarativo dell’ambiente globale, che non è basato sull’object globale.

Secondo le specifiche :

“Le dichiarazioni let e const definiscono le variabili che sono associate al contesto LexicalEnvironment del contesto di esecuzione.”

Ciò significa che dovresti essere in grado di accedere alla variabile all’interno dello scope di esecuzione, ma non all’esterno. Questo espande l’ambito dell’esecuzione oltre la classica struttura di chiusura JS di sola funzione o globale.

Definire una variabile let lascia globalmente aperta all’interpretazione, come si vede in Firefox che lega una variabile globale dove V8 / iojs non lo fa.

Vale la pena ricordare che console.log(typeof x) restituirà il number in iojs. In pratica non dovresti definire variabili al di fuori dei moduli, o funzioni il più ansible … specialmente con const e let