javascript global-variables local-variables hoisting

javascript - ¿Por qué una variable global definida no está definida?



global-variables local-variables (4)

Esta pregunta ya tiene una respuesta aquí:

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)