funciona - javascript pdf
¿Se está rompiendo la privacidad del alcance de JavaScript? (2)
Te has topado con algo llamado izar. Dado que todas las variables tienen un alcance para su función contenedora, las sentencias var
se mueven internamente a la parte superior de la función.
Eso significa que el intérprete realmente ejecutará este código:
function doSomething() {
var shouldBePrivate;
var d;
for(d = 0;d < 10;d++) {
shouldBePrivate = 5;
}
for(d = 0;d < 10;d++) {
// now it''s easy to see why this works
console.log(shouldBePrivate);
}
}
A partir de ES2015, puede usar la palabra clave let
lugar de var
que tiene un alcance léxico, es decir, tiene un ámbito dentro de bloques, lo que significa que debe let shouldBePrivate = 5;
no existirá fuera del primer ciclo.
function doSomething() {
for(let d = 0;d < 10;d++) {
let shouldBePrivate = 5;
}
for(let d = 0;d < 10;d++) {
// Reference Error for shouldBePrivate
console.log(shouldBePrivate);
}
}
Así que me encontré con algo muy extraño mientras trabajaba en un proyecto de javascript justo ahora y aquí hay un ejemplo reducido de la situación en la que estoy confundido:
function doSomething() {
for(var d = 0;d < 10;d++) {
var shouldBePrivate = 5;
}
for(var d = 0;d < 10;d++) {
console.log(shouldBePrivate);
}
}
Cuando se llama a doSomething (), se puede acceder a la variable shouldBePrivate en el segundo bucle for.
¿No debería eso no ser posible?
Todas las variables locales en javascript tienen alcance de función y no el alcance del bloque (al menos antes de ECMAScript 2015
). Lo que significa que las variables declaradas dentro de la función, disponibles para toda la función.
Lo que te refieres es el alcance del bloque. Lamentablemente, el alcance noblock en Javascript hasta ECMA2015
. Desde ECMAScript 2015
, puede declarar sus variables con let
que solo se pueden consultar en el bloque y mueren tan pronto como sale de ese bloque.
Bloquear reglas de alcance
Con var
Las variables declaradas con var no tienen alcance de bloque. Las variables introducidas con un bloque tienen un alcance para la función o script que contiene, y los efectos de establecerlas persisten más allá del bloque mismo. En otras palabras, las instrucciones de bloque no introducen un alcance. Aunque los bloques "independientes" son sintaxis válidos, no desea usar bloques independientes en JavaScript, porque no hacen lo que cree que hacen, si cree que hacen algo parecido a dichos bloques en C o Java. por
example:
var x = 1;
{
var x = 2;
}
console.log(x); // logs 2
Esto registra 2 porque la instrucción var x dentro del bloque está en el mismo ámbito que la instrucción var x antes del bloque. En C o Java, el código equivalente habría generado 1.
Con let y const
Por el contrario, los identificadores declarados con let y const tienen un alcance de bloque:
let x = 1;
{
let x = 2;
}
console.log(x); // logs 1
The x = 2 is limited in scope to the block in which it was defined.