descargar - void(0) javascript href
¿JavaScript equivalente a los locales de Python()? (6)
En Python uno puede obtener un diccionario de todas las variables locales y globales en el alcance actual con las funciones incorporadas locals()
y globals()
. ¿Hay alguna forma equivalente de hacer esto en Javascript? Por ejemplo, me gustaría hacer algo como lo siguiente:
var foo = function(){ alert(''foo''); };
var bar = function(){ alert(''bar''); };
var s = ''foo'';
locals()[s](); // alerts ''foo''
¿Es esto posible, o debería estar usando un objeto local para la búsqueda?
@ 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'' solo existe dentro del alcance de la función ''foo''. No está definido en el alcance de la ventana.
Por supuesto, esto realmente no responde a la pregunta original, solo quería intervenir en esta respuesta. No creo que haya una manera de hacer lo que la pregunta original me hizo.
@pkaeding
Sí tienes razón. window [nombreFunción] () no funciona en este caso, pero eval sí. Si necesitaba algo como esto, crearía mi propio objeto para mantener esas funciones juntas.
var func = {};
func.bar = ...;
var s = "bar";
func[s]();
AFAIK, no. Si solo desea verificar la existencia de una variable determinada, puede hacerlo probándola, algo como esto:
if (foo) foo();
Bueno, no creo que haya algo así en js. Siempre puede usar eval en lugar de locals (). Me gusta esto:
eval(s+"()");
Solo tienes que saber que en realidad la función foo existe.
Editar:
No use eval :) Uso:
var functionName="myFunctionName";
window[functionName]();
Me parece recordar que Brendan Eich comentó sobre esto en un podcast reciente; si recuerdo correctamente, no se está considerando, ya que agrega restricciones irrazonables a la optimización. Lo comparó con los arguments
locales en que, aunque es útil para varargs, su propia existencia elimina la capacidad de adivinar lo que tocará una función con solo mirar su definición.
Por cierto: creo que JS sí tuvo soporte para acceder a los locales a través de los argumentos locales a la vez. Sin embargo, una búsqueda rápida muestra que esto ha quedado en desuso.
lugareños () - No.
globals () - Sí.
window
es una referencia al alcance global, como globals()
en python.
globals()["foo"]
es lo mismo que:
window["foo"]