objetos metodos funciones attribute array agregar javascript ecmascript-6 let

javascript - metodos - ¿Permiten las declaraciones crear propiedades en el objeto global?



title css (5)

¿ let declaraciones crear propiedades en el objeto global?

Según la spec , no:

Un registro de entorno global es lógicamente un registro único, pero se especifica como un compuesto que encapsula un registro de entorno de objeto y un registro de entorno declarativo . El registro del entorno del objeto tiene como objeto base el objeto global del Realm asociado. Este objeto global es el valor devuelto por el método concreto GetThisBinding del registro de entorno global. El componente de registro de entorno de objeto de un registro de entorno global contiene los enlaces para todos los globales incorporados ( Realm ) y todos los enlaces introducidos por una declaración de función , declaración de generador o declaración de variables contenida en el código global. Los enlaces para todas las demás declaraciones ECMAScript en el código global están contenidos en el componente de registro de entorno declarativo del registro de entorno global.

Alguna explicación más:

  • Un registro de entorno declarativo almacena los enlaces en una estructura de datos interna. Es imposible obtener esa estructura de datos de ninguna manera (piense en el alcance de la función).

  • Un registro de entorno de objeto utiliza un objeto JS real como estructura de datos. Cada propiedad del objeto se convierte en un enlace y viceversa. El entorno global tiene un objeto de entorno de objeto cuyo "objeto de enlace" es el objeto global. Otro ejemplo es with .

Ahora, como dice la parte citada, solo FunctionDeclaration s, GeneratorDeclaration s y VariableStatement s crean enlaces en el registro de entorno de objetos del entorno global. Es decir, solo estos enlaces se convierten en propiedades del objeto global.

Todas las demás declaraciones (por ejemplo, const y let ) se almacenan en el registro de entorno declarativo del entorno global, que no se basa en el objeto global.

En JavaScript, las declaraciones var crean propiedades en el objeto global:

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

ES6 presenta un alcance léxico con declaraciones let que tienen alcance de bloque.

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

Sin embargo, ¿estas declaraciones crean propiedades en el objeto 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


Ambas variables let y var , si se declaran en el nivel superior de un script, son accesibles fuera del archivo de script. Sin embargo, solo las variables var se asignan al objeto de window . Eche un vistazo a este fragmento de código como prueba:

<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>


Las variables declaradas mediante la palabra clave let no crean propiedades accesibles en un objeto global ( ventana para un navegador). En realidad, Firefox arregló su comportamiento: let v = 42; ''v'' in window // false let v = 42; ''v'' in window // false


Por la especificación :

"las declaraciones let y const definen variables que tienen un ámbito para el entorno LexicalEnvironment del contexto de ejecución en ejecución".

Esto significa que debería poder acceder a la variable dentro del ámbito de ejecución, pero no fuera. Esto amplía el alcance de la ejecución más allá de la clásica estructura de cierre JS de solo función o global.

La definición de una variable let globalmente deja esto abierto a interpretación, como puede ver en Firefox, vincula una variable global donde V8 / iojs no lo hace.

Vale la pena mencionar que console.log(typeof x) devolverá el number en iojs. En la práctica, no debe definir variables fuera de los módulos, o funciones tanto como sea posible ... especialmente con const y let


let permite declarar variables que tienen un alcance limitado al bloque, declaración o expresión en la que se usa. Esto es diferente a la palabra clave var , que define una variable globalmente o localmente para una función completa, independientemente del alcance del bloque.

En el nivel superior de programas y funciones, let, a diferencia de var, no crea una propiedad en el objeto global. Por ejemplo:

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

El alcance de una variable declarada con var es su contexto de ejecución actual, que es la función de cierre o, para variables declaradas fuera de cualquier función, global. Si vuelve a declarar una variable de JavaScript, no perderá su valor. Por ejemplo:

var x = 1; if (x === 1) { var x = 2; console.log(x); // output: 2 } console.log(x); // output: 2

Nota: a diferencia de C , C ++ y Java , JavaScript no tiene alcance a nivel de bloque cuando declara una variable usando var .

Como mencionamos anteriormente, let le permite declarar variables que tienen un alcance limitado al bloque, declaración o expresión en la que se utiliza. Por ejemplo:

let x = 1; if (x === 1) { let x = 2; console.log(x); // output: 2 } console.log(x); // output: 1

Aquí te recomiendo que leas sobre el alcance variable