variable - var html javascript
¿Por qué la variable local mata mi variable global? (7)
Lo siento por esta pregunta, pero este problema realmente arruinó mi día.
El siguiente Código alerta al 10 como debería:
var globalId=''10'';
function check(){
alert(globalId);
}
check();
Pero este siguiente código alerta indefinido :
var globalId=''10'';
function check(){
alert(globalId);
var globalId;
}
check();
Soy consciente de que si declaro una variable en una función es una variable local, pero si ya la declaré como global, ¿cómo puede ser que mis alertas no estén definidas ?
Este es un ejemplo fácil, pero en mi código original hice un montón de cosas entre el comienzo de la función, luego verifiqué un largo camino hacia abajo para ver si se definió globalId
; de lo contrario, globalId
: if(!globalId){var globalId;}
Esto significaba que mi alerta situada en la parte superior de la función generaba undefined, como si JavaScript primero ejecutara la función completa, solo para ver si alguna variable "podría" ser declarada, y si es así, declararlas y por lo tanto mi alerta apuntaba a una variable ''no declarada''.
¿Puede alguien explicarme por qué sucede esto y si es cierto que JavaScript "declara previamente" todas las variables antes de ejecutar una función, incluso las variables declaradas en condiciones que ni siquiera se cumplen?
como si Javascript primero ejecutara toda la función, solo para ver si alguna variable ''podría'' ser declarada
Esta es la respuesta, más o menos. El intérprete de JavaScript busca declaraciones de variables dentro de cada ámbito, luego las "mueve" al principio del ámbito.
Como se ha dicho, conforme a las reglas de alcance de JavaScript, la variable local enmascara el global para toda la función. Sin embargo, la variable global puede ser accesada, intente lo siguiente
var globalId=''10'';
function check() {
// Your are defining a local variable in this function
// so, the global one is not visible.
alert(''Local : '' + globalId + '', Global : '' + window.globalId);
var globalId;
}
check();
En javascript, debes saber que hay algo que se llama como HISTORIAL .
Lo que esto significa esencialmente es que, cuando declara cualquier variable local, la declaración de la variable se lleva automáticamente al principio del alcance.
p.ej:-
var globalId=''10'';
function check(){
alert(globalId); var globalId; }
check();
Cambios a -
var globalId=''10'';
function check(){
var globalId;
alert(globalId);}
check();
Como a globalID aún no se le asigna ningún valor, devuelve indefinido en su salida. Las variables locales siempre tienen prioridad sobre las variables globales con el mismo nombre.
En su segunda porción de código, la variable local enmascara la global.
var globalId=''10'';
function check() {
// Your are defining a local variable in this function
// so, the global one is not visible.
alert(globalId);
var globalId;
}
check();
El hecho de que la instrucción var
yopur esté al final de la definición de la función no cambia nada: la variable global se enmascara para toda la función .
Entonces, para toda la ejecución de la función, la variable globalId
hará referencia a la local, y no a la global.
Sin embargo, fuera de esa función, la variable global seguirá existiendo, simplemente no se verá desde dentro de la función, debido a la declaración var
.
Sí, todas las variables declaradas en cualquier lugar de una función son locales a esa función y existen en todo el código de la función; Se utilizarán con preferencia a las globales del mismo nombre.
Desde https://developer.mozilla.org/en/JavaScript/Guide/Values,_Variables,_and_Literals#Variable_Scope :
JavaScript no tiene un alcance de declaración de bloque; más bien, será local al código en el que reside el bloque. [...] Otra cosa inusual acerca de las variables en JavaScript es que puede referirse a una variable declarada más adelante, sin obtener una excepción. Este concepto se conoce como elevación; Las variables en JavaScript están, en cierto sentido, "elevadas" o elevadas a la parte superior de la función o declaración.
declara NUEVA variable globalId
dentro del alcance de la función, por lo que no está definido y esto es correcto. Y no, no es matar su variable global, puede verificarla agregando alert(globalId);
después de la check();
llamada.
var globalId=''10'';
function check(){
let globalId = ''5'';
alert(globalId);
}
check();
// use let to set a local variable between any {}