2010-09-17 16 views
26

espero que esta pregunta no es demasiado simple, pero no tengo ni idea :(Javascript - ¿Variable en el nombre de la función, posible?

¿Cómo puedo iniciar una función con una var en el nombre de la función?

Por ejemplo ...

mis funciones

function at_26(); 
function at_21(); 
function at_99(); 

iniciar la función de

var test_id = 21; 
at_'+test_id+'(); // doesn't work 

Espero que alguien me pueda ayudar.

¡Gracias de antemano! Peter

+5

¿Por qué necesita eso? Puede crear una función llamada 'at()' y pasarle su número como argumento. – jwueller

Respuesta

57

Almacene sus funciones en un objeto en lugar de convertirlas en un nivel superior.

var at = { 
    at_26: function() { }, 
    at_21: function() { }, 
    at_99: function() { } 
}; 

A continuación, puede acceder a ellos como cualquier otro objeto:

at['at_' + test_id](); 

También se puede acceder a ellos directamente desde el objeto window ...

window['at_' + test_id](); 

... y evitar tener que almacenarlos en un objeto, pero esto significa jugar en el alcance global que debe evitarse.

+0

¡Buena idea, muchas gracias! – Peter

+5

Tengo más curiosidad sobre por qué alguien crearía 100 funciones que difieren solo en un índice ... – colithium

+3

Pruebas. Digamos que tiene una biblioteca de utilidades que hace algo así como transformar rutas. Es posible que tenga una serie de rutas hacia las cuales probar cada método. Esta es una manera fácil de agregar utilidades a la biblioteca sin duplicar el código para ejecutar las pruebas para cada nuevo método. – jonschlinkert

2

También puede intentar

function at_26(){}; 
function at_21(){}; 
function at_99(){}; 

var test_id = 21; 
eval('at_'+test_id+'()'); 

Pero utilizar este código si usted tiene razones poderosas para utilizar eval. Usar eval en javascript no es una buena práctica debido a sus desventajas, tales como "usarlo incorrectamente puede abrir su script para ataques de inyección".

+2

¡No! ¡No use 'eval()' en este caso! ¡Aquí hay soluciones mucho mejores! – jwueller

+1

@elusive: Eso es correcto, siempre se deben usar mejores soluciones. Acabo de dar una solución alternativa. Espero que no te importe. – Nik

+2

Dado que no todos necesariamente conocen la maldad de 'eval()', debes proporcionar esta información en tu publicación. Nadie debería usar esta solución a menos que tenga una muy buena razón y esté exactamente enterado de lo que está haciendo. 'eval()' tiene sus usos válidos, pero este no es uno de ellos. – jwueller

17

Usted estuvo cerca.

var test_id = 21 
this['at_'+test_id]() 

Sin embargo, lo que es posible que desee:

at = [] 
at[21] = function(){ xxx for 21 xxx } 
at[test_id]() 
+1

'this ['is_awesome']; // Gracias' – Giraldi

0

Hay camino mejor que el objeto de la ventana - que no es amigable en Firefox - utiliza "auto" en lugar - por lo que en el ejemplo publicado por Quentin se ve así:

self['at_' + test_id]();

Cuestiones relacionadas