tipo - Variables de JavaScript ''Hoisting''
variables int en javascript (4)
No entiendo completamente por qué la siguiente muestra "alzado" hacia el final.
var x = ''set'';
var y = function ()
{
// WHAT YOU DON''T SEE -> var x;
// is effectively "hoisted" to this line!
if (!x)
{
// You might expect the variable to be populated at this point...it is not
// though, so this block executes
var x = ''hoisted'';
}
alert(x);
}
//... and this call causes an alert to display "hoisted"
y();
Cualquier indicador sería apreciada.
Citando MDN Docs sobre var
izar ,
Debido a que las declaraciones de variables (y declaraciones en general) se procesan antes de que se ejecute cualquier código, declarar una variable en cualquier parte del código es equivalente a declararlo en la parte superior. Esto también significa que una variable puede aparecer para ser utilizada antes de que sea declarada. Este comportamiento se denomina "elevación", ya que parece que la declaración de la variable se mueve a la parte superior de la función o código global.
Entonces, en su caso, JavaScript sabe que una variable local (no la declarada afuera) x
se define en algún lugar de la función, pero no conoce el valor real de la misma hasta que la ejecución alcanza una declaración de asignación que asigna a x
. (Las declaraciones se procesan durante el tiempo de compilación y las asignaciones se realizan en el tiempo de ejecución). Hasta que finalice la asignación, se utilizará el valor predeterminado undefined
. Como undefined
es falso , la condición
if (!x) {
está satisfecho y la instrucción de asignación se ejecuta. Es por eso que te están hoisted
en el cuadro de alerta.
Digamos que no has declarado x
dentro de la función,
var x;
var y = function () {
if (!x) {
x = ''hoisted'';
}
alert(x);
}
y();
alert(x);
Aquí, dado que x
no se declara en ningún lugar dentro de la función, en tiempo de ejecución, JavaScript buscará x
en los ámbitos más altos. En este caso, lo encuentra justo fuera de la función. Entonces, esa x
será utilizada. Dado que asignó hoisted
a x
, la alert
interna también dirá hoisted
y después de abandonar la función, alert(x)
también alertará hoisted
.
Jaja, el problema es que estás creando la variable x nuevamente.
var x = ''set'';
var y = function (){
if (!x)
{
// just use the = sign to update the value of it.
x = ''hoisted'';
};
alert(x);
};
y();
Las declaraciones de variables se elevan a la parte superior del alcance. Entonces tu código es equivalente a esto:
var x = ''set'';
var y = function () {
var x;
if (!x) {
x = ''hoisted'';
}
alert(x);
}
y();
Cuando se ejecuta y, var x
sombrea el alcance exterior x
por lo que dentro de la función y
x
undefined
está undefined
después de la primera línea de declaración.
esta respuesta explica en detalle los diferentes ámbitos de las variables. En su caso particular, puede usar la referencia a:
this.x;
Para acceder a la variable x global fuera de la función. Debido a que dentro de la función que está tratando de acceder a una variable indefinida, utilizando la palabra clave this
hace referencia a variables fuera de la función.
Y la parte de
if(!x)
Es cierto porque está probando: is false
y x
en ese punto undefined
está undefined
porque no existe en el alcance de la función, y undefined
se considera uno de los valores falsos en JS, para obtener más información , mire aquí .