2010-02-25 10 views
14

Duplicar posible:
How can I access local scope dynamically in javascript?Javascript: Obtener acceso a la variable local o variable en el cierre por su nombre

Hola a todos.
Todos sabemos que puede acceder a una propiedad de un objeto javascript por su nombre utilizando la sintaxis []. ob ['nameOfProperty'].

¿Se puede hacer lo mismo para una variable local? Otra respuesta here sugirió que la respuesta es usar la ventana ['nameOfVar']. Sin embargo, esto solo funcionó para el póster ya que estaba definiendo variables al alcance del nivel de ventana.

Supongo que esto debe ser posible en general, ya que el Firebug de Firefox (que creo que está escrito en javascript) puede mostrar variables locales y de cierre. ¿Hay alguna función de lenguaje oculto de la que no tengo conocimiento?

En concreto, esto es lo que quiero hacer:

var i = 4; 
console.log(window['i']); // this works.. 

function Func(){ 
    var j = 99; 

    // try to output the value of j from its name as a string 
    console.log(window['j']); // unsurprisingly, this doesn't work 
} 

Func(); 
+1

Consulte http://stackoverflow.com/questions/598878/how-can-i-access-local-scope-dynamically-in-javascript –

+0

También puede ver http://stackoverflow.com/questions/ 1119335/javascript-local-variable-declare http: // stackoverflow.com/questions/598878/how-can-i-access-local-scope-dynamically-in-javascript –

Respuesta

13

No conozco nada incorporado en JavaScript para hacer referencia a variables locales como esa (aunque probablemente debería considerar todas las variables a las que las cadenas hacen referencia internamente).

yo sugeriría mantener todas las variables de un objeto si realmente necesita el acceso de cadena:

var variables = { 
    "j": 1 
}; 
alert(variables["j"]); 

Actualización: En cierto modo me molesta que no hay manera de hacer esto como usted desea. Internamente, la variable es un enlace mutable en los registros del entorno declarativo. Las propiedades están ligadas al objeto del que son propiedad a través de los registros de entorno del objeto, pero en realidad hay una forma de acceder a ellas mediante corchetes. Desafortunadamente, no hay forma de acceder a los registros del entorno declarativo de la misma manera.

+0

Bob, me molesta también. Es el hecho de que EcmaScript admite esto en teoría, pero la implementación (JavaScript) no lo hace. –

7

Acceso a la variable con ventana o cualquier otro descriptor de acceso global no funcionará porque la variable no es accesible a nivel mundial. Pero se puede utilizar puede utilizar eval para evaluar cualquier expresión:

<script> 
function test(){ 
    var j = 1; 
    alert(eval("j")); 
} 

test(); 
</script> 
+0

Gracias Pan. Supongo que debería haber sido más claro en la pregunta y decir sin usar eval. :-) Parece que esta es la única forma de hacer lo que quiero sin modificar el patrón. –

2

No, porque la variable sólo se puede acceder desde dentro de los contextos de ejecución que contienen el alcance de la variable.

Dicho de otra manera, la única forma en que puede acceder al j es si está accediendo a él desde algo en el alcance de test - a través de una función interna, o lo que sea. Esto es porque j, en cierto sentido, no existe para objetos con un alcance más amplio, como el objeto global. Si no fuera así, los nombres de las variables tendrían que ser únicos a nivel mundial.

2

¿Qué hay de:

<script> 
    function Func(){ 
     var fn = arguments.callee; 
     fn.j = 99; 
     console.log(fn['j']); 
    } 
    Func(); 
    console.log(window['j']); //not global 
    console.log(Func['j']); //but not private 
</script> 
+0

Como Func no es un objeto, esto apunta al objeto global. Básicamente estás diciendo ventana ['j'] – Bob

+0

@Bob, ¿lo has probado antes de votarme? Porque funciona – Mic

+0

@Bob, vale, te tengo, tienes razón – Mic

2

No, esto no es posible en general. JavaScript resuelve los identificadores dentro de una función usando la cadena de alcance; no hay un solo objeto que contenga todas las variables en el alcance, y los objetos en la cadena de alcance no son accesibles desde JavaScript que se ejecuta en la página.

Cuestiones relacionadas