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