javascript - ¿Por qué una variable global definida no está definida?
global-variables local-variables (4)
Esta pregunta ya tiene una respuesta aquí:
- ''Hoisted'' JavaScript Variables 3 respuestas
Hola chicos, tengo una función simple y una variable global.
¿Por qué mi nombre no está
undefined
y no la cadena"global"
?
var myname = "global"; // global variable
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
¿No es posible referirse a una variable externa que se define fuera del alcance de esa función? y en esto una variable global ...
¿Y cómo puedo solucionar esto para no obtener una variable global
undefined
?
Acaba de toparse con una "característica" js llamada elevación
var myname = "global"; // global variable
function func() {
alert(myname); // "undefined"
var myname = "local";
alert(myname); // "local"
}
func();
En este código, cuando define
func
el compilador mira el cuerpo de la función.
Ve que estás declarando una variable llamada
myname
.
Javascript Levanta declaraciones de variables y funciones, moviendo la declaración a la parte superior de la función.
Debido a la elevación, su código se reescribe a lo siguiente.
var myname = "global"; // global variable
function func() {
var myname; //declare local variable and assign it undefined
alert(myname); // "undefined"
myname = "local"; // assign local var myname to "local"
alert(myname); // "local"
}
func();
Esto "Cubre" la variable global.
Si desea acceder a la variable global dentro del alcance de una función, use
this
palabra clave.
var myname = "global"; // global variable
function func() {
var myname = "local";
alert(this.myname); // "global"
alert(myname); // "local"
}
func();
Tenga en cuenta que esto solo funciona al llamar a una función, no a un método o constructor, porque
this
palabra clave cambia a lo que está vinculada en función de cómo llama a una función.
EDITAR: para completar
Si desea obtener acceso a variables globales en cualquier contexto, independientemente del tipo de función, declare una variable global que, por convención, nunca cubra.
var global = this; // in global scope.
var myname = "global";
var obj = {f: function () {
var myname = "local";
console.log(global.myname);
}};
obj.f(); // "global"
Tenga en cuenta que esto está en posición de método y que
this
palabra clave se refiere a obj directamente y, por lo tanto, no tiene mi nombre definido.
Dentro de una función, estás declarando
var myname = "local"
.
Aunque lo esté haciendo en el medio del método, esa variable tiene alcance de función, por lo que pertenece a toda la función, incluso al código que se encuentra arriba.
Por lo tanto, el valor de la variable local no está definido antes de esa línea y tiene un valor después, pero ninguno toca la variable global.
La razón por la que la primera alerta no está definida es porque volvió a declarar
global
como una variable local debajo de ella en la función.
Y en javascript eso significa que desde la parte superior de la función se considera la variable local.
El siguiente funciona porque justo encima de la alerta le dio un valor.
Olvida "var" en la primera línea:
var myName = "global";
La elevación simplemente se refiere al hecho de que javascript pasa y establece todas las variables que se inicializan en el valor indefinido (no una cadena)