2008-09-02 13 views
19

En Python se puede obtener un diccionario de todas las variables locales y globales en el alcance actual con las funciones integradas locals() y globals(). ¿Hay alguna forma equivalente de hacer esto en Javascript? Por ejemplo, me gustaría hacer algo como lo siguiente:equivalente de Javascript de los locales de Python()?

var foo = function(){ alert('foo'); }; 
var bar = function(){ alert('bar'); }; 

var s = 'foo'; 
locals()[s](); // alerts 'foo' 

¿Este es posible, o debo estar usando un objeto local para las operaciones de búsqueda?

Respuesta

15
  • locales() - No.

  • globales() - Sí.

window es una referencia al ámbito global, como globals() en Python.

globals()["foo"] 

es lo mismo que:

window["foo"] 
+5

Solo en un navegador u otro entorno host que implemente * window *. – RobG

+1

Eso es verdad. No hay ninguna manera de hacer esto en Node por ejemplo? Supongo que debería haber cambios, ya que esta es una respuesta general de JavaScript. – sverrejoh

+4

cuando no hay * ventana *, hay * global * - http://stackoverflow.com/q/10984629/596361 –

4

Bueno, no creo que haya algo así en js. Siempre puede usar eval en lugar de locals(). De esta manera:

eval(s+"()"); 

Sólo hay que saber que en realidad funciona foo existe.

Editar:

No utilice eval :) Uso:

var functionName="myFunctionName"; 
window[functionName](); 
+0

Uso del objeto de la ventana, sólo se le da acceso a variables globales, no a las variables locales. –

0

yo sepa, no. Si lo que desea es comprobar la existencia de una determinada variable, puede hacerlo mediante pruebas de ella, algo como esto:

if (foo) foo(); 
+0

Eso solo funcionará si la variable se ha definido, de lo contrario arrojará un error de referencia. –

3

Creo recordar Brendan Eich ha comentado esta en un podcast reciente; si recuerdo correctamente, no se está considerando, ya que agrega restricciones irrazonables a la optimización. Lo comparó con el arguments local en que, aunque es útil para varargs, su mera existencia elimina la capacidad de adivinar lo que tocará una función con solo mirar su definición.

BTW: Creo JS hizo tienen soporte para acceder a los locales a través de los argumentos locales a la vez - a quick search muestra esto ya no se utiliza sin embargo.

0

@ e-bartek, creo que la ventana [nombre de función] no funcionará si tiene algún cierre, y el nombre de la función es local para ese cierre. Por ejemplo:

function foo() { 
    var bar = function() { 
     alert('hello world'); 
    }; 
    var s = 'bar'; 
    window[s](); // this won't work 
} 

En este caso, s es 'bar', pero la función 'bar' sólo existe dentro del ámbito de aplicación de la función de 'foo'. No está definido en el alcance de la ventana.

Por supuesto, esto realmente no responde a la pregunta original, solo quería responder esta respuesta. No creo que haya una manera de hacer lo que la pregunta original me hizo.

0

@pkaeding

Sí, tienes razón. ventana [nombreFunción]() no funciona en este caso, pero eval hace. Si necesitaba algo como esto, crearía mi propio objeto para mantener esas funciones juntas.

var func = {}; 
func.bar = ...; 
var s = "bar"; 
func[s](); 
Cuestiones relacionadas