2009-06-06 34 views
23

O más específico para lo que necesito:¿Las variables tienen un "alcance" estático o dinámico en javascript?

Si llamo a una función desde otra función, ¿va a extraer la variable desde la función de llamada, o desde el nivel anterior? Ej .:

myVar=0; 

function runMe(){ 
    myVar = 10; 
    callMe(); 
} 

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

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

+11

¿Por qué no lo ejecutas y lo averiguas? –

+0

¿No es mejor documentar la pregunta para que otros puedan verla también? – affinehat

Respuesta

39

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

myVar=0; 

function runMe(){ 
    var myVar = 10; 
    callMe(); 
} 

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

runMe(); 
alert(addMe); 
alert(myVar); 

En un lenguaje estáticamente con ámbito (como JS), que alerta a 10, y 0. El miVar var (variable local) en RunMe sombras del miVar global en esa función. Sin embargo, no tiene ningún efecto en CallMe, por lo CallMe utiliza el miVar mundial que todavía está a 0.

En una lengua de ámbito dinámico (a diferencia de JS), CallMe heredaría alcance de RunMe, por lo que se convertiría en AddMe 20. Tenga en cuenta que myVar aún estará en 0 en la alerta, porque la alerta no hereda el alcance de ninguna función.

+9

la excepción es la palabra clave 'this' que se comporta como una variable de ámbito dinámico – Jaksa

3

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

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

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

+0

me refiero al alcance ... – kylex

2

Las variables tienen un alcance estático en JavaScript (el alcance dinámico es realmente un asunto bastante complicado: puede leer más sobre él en Wikipedia).

En su caso, sin embargo, está utilizando una variable global, por lo que todas las funciones tendrán acceso a esa misma variable. La respuesta de Matthew Flaschen muestra cómo se puede cambiar, por lo que el segundo myVar es en realidad una variable diferente.

This Page explica cómo declarar las variables globales frente a las locales en JavaScript, en caso de que no esté demasiado familiarizado con ellas. Es diferente de la forma en que lo hacen la mayoría de los lenguajes de scripting. (En resumen: la palabra clave "var" hace que una variable local si se declara dentro de una función, de lo contrario la variable es global.)

0

Por lo que yo entiendo, cualquier variable sin el var palabra clave es tratado mundial, con ella, su local, con ámbito, 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 JS, se recomienda añadir SIEMPRE el var palabra clave.

1

A menos que utilice la palabra clave var para definir sus variables, todo termina siendo una propiedad en el objeto window.Así que el 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 se mantiene esto en mente, siempre debe quedar claro lo que está sucediendo.

0

Me gustaría agregar que las expresiones lambda también tienen un alcance estático en la ubicación en 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.

0
myVar=0; 

function runMe(){ 
    myVar = 10; 
    callMe(); 
} 

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

En lo que a la salida se refiere miVar y AddMe tanto será variable global en este caso, como en javascript si no' t declara una variable con var, entonces lo declara implícitamente como global, por lo tanto, cuando llamas a runMe() entonces myVar tendrá el valor 10 y addMe tendrá 20.

Cuestiones relacionadas