variable scripts globales closure javascript scoping

scripts - ¿Las variables están estáticas o dinámicamente "con alcance" en javascript?



scope y closure (7)

O más específico a lo que necesito:

Si llamo a una función desde dentro de otra función, ¿va a extraer la variable desde dentro de la función de llamada, o desde el nivel superior? Ex:

myVar=0; function runMe(){ myVar = 10; callMe(); } function callMe(){ addMe = myVar+10; }

¿Qué termina siendo myVar si se llama a callMe () a través de runMe ()?


A menos que use la palabra clave var para definir sus variables, todo termina siendo una propiedad en el objeto de la window . Entonces tu código sería equivalente a lo siguiente:

window.myVar=0; function runMe(){ window.myVar = 10; window.callMe(); } function callMe(){ window.addMe = window.myVar+10; }

Si tiene esto en cuenta, siempre debe quedar claro lo que está sucediendo.


Jeff tiene razón. Tenga en cuenta que esto no es realmente una buena prueba de alcance estático (que JS tiene). Una mejor sería:

myVar=0; function runMe(){ var myVar = 10; callMe(); } function callMe(){ addMe = myVar+10; } runMe(); alert(addMe); alert(myVar);

En un lenguaje de ámbito estático (como JS), que alerta sobre 10 y 0. La var myVar (variable local) en runMe sombrea la myVar global en esa función. Sin embargo, no tiene ningún efecto en callMe, por lo que callMe utiliza el myVar global que todavía está en 0.

En un lenguaje de alcance dinámico (a diferencia de JS), callMe heredaría el alcance de runMe, por lo que addMe se convertiría en 20. Tenga en cuenta que myVar aún sería 0 en la alerta, porque la alerta no hereda el alcance de ninguna de las funciones.


Las variables tienen un ámbito estático en JavaScript (el alcance dinámico es realmente un negocio bastante desordenado: puede leer más sobre esto en Wikipedia ).

Sin embargo, en su caso, está utilizando una variable global, por lo que todas las funciones accederán a esa misma variable. La respuesta de Matthew Flaschen muestra cómo se puede cambiar, por lo que la segunda myVar es en realidad una variable diferente.

Esta página explica cómo declarar variables globales vs. locales en JavaScript, en caso de que no esté muy familiarizado con ello. Es diferente de la forma en que la mayoría de los lenguajes de scripting lo hacen. (En resumen: la palabra clave "var" hace que una variable sea local si se declara dentro de una función, de lo contrario, la variable es global).


Me gustaría agregar que las expresiones lambda también tienen un alcance estático en la ubicación en la que se define la expresión. Por ejemplo,

var myVar = 0; function foo() { var myVar = 10; return { bar: function() { addMe = myVar + 10; }} } var myObj = foo(); var addMe = 6; alert(addMe); myVar = 42; myObj.bar(); alert(addMe);

Esto mostrará 6 y 20.


Por lo que entiendo, cualquier variable sin la palabra clave var se trata de forma global , con ella, su ámbito local, por lo que:

// This is a local scoped variable. var local_var = "something"; // This is a global scoped variable. global_var = "something_else";

Como una buena práctica de JS, se recomienda SIEMPRE agregar la palabra clave var .


si su siguiente línea es callMe (); , entonces addMe tendrá 10, y myVar será 0.

si su siguiente línea es runMe (); , entonces addMe tendrá 20, y myVar será 10.

Perdóneme por preguntar: ¿qué tiene esto que ver con el enlace estático / dinámico? ¿No es myVar simplemente una variable global, y el código de procedimiento (desenvolver todo en la pila de llamadas) no determinará los valores?


myVar=0; function runMe(){ myVar = 10; callMe(); } function callMe(){ addMe = myVar+10; }

En lo que respecta a la salida, myVar y addMe serán variables globales en este caso, como en javascript si no declara una variable con var, entonces la declara implícitamente como global, por lo tanto, cuando llame a runMe (), myVar tendrá El valor 10 y addMe tendrán 20.