2010-10-08 7 views
6

que tienen una variableCómo llamar a la función usando el valor almacenado en una variable?

var functionName="giveVote"; 

Lo que tengo que hacer es, quiero llamar a la función almacenada en functionName var. Intenté usar functionName(); . Pero no está funcionando. Por favor ayuda.

Editar Basado en el mismo problema, tengo

$(this).rules("add", {txtInf: "^[a-zA-Z'.\s]{1,40}$" }); 

reglas es una función que toma predifined methodName :, He aquí hardcoded txtInf. Pero quiero proporcionar una variable de JavaScript aquí, para hacer que mi código sea genérico. var methodName = "txtInf";

Aquí quiero evaluar methodName primero antes de ser utilizado en la función de reglas.

$(this).rules("add", {mehtodName: "^[a-zA-Z'.\s]{1,40}$" }); 
+0

¿Cómo se relaciona esto con .NET? –

Respuesta

10

Tiene un puñado de opciones, dos básicas incluyen window[functionName]() o setTimeout(functionName, 0). Darles una oportunidad.

Editar: si su variable es solo el nombre de la cadena de una función, utilícelos; de lo contrario, si usted es capaz de asignar realidad una referencia a la función de la variable (por ejemplo, var foo = function() {};), se puede usar la notación foo(), o foo.apply(this, []), etc.

Edición 2: Evaluar methodName en su lugar antes de la cocción $(this).rules() , usted acaba de aplicar la primera sintaxis anterior (utilizando el objeto window), así:

$(this).rules("add", {window[methodName](): ...}); 

Creo que eso es lo que estás preguntando - si no, por favor, aclarar un poco más y voy a ser feliz para reescribir una solución.

+0

Bien, gracias por mencionar setTimeout, debería funcionar. –

+0

Por favor, vea las ediciones. –

+0

No estoy seguro de lo que quiere decir. ¿Estás diciendo que la expresión regular debería pasar como argumento para la función?¿O que define una plantilla para la nomenclatura? – mway

1

¿Por qué no simplemente pasar la secuencia directamente a donde desea llamar a la función? ¿Por qué almacenarlo primero? Eso parece más confuso ya que es otra capa de indirección (y, en última instancia, puede hacer que su código sea más difícil de depurar).

Por ejemplo:

$('.someSelector').click(giveVote); 

no veo una ventaja particular para hacer lo que estamos tratando de hacer.

7
var functionName="giveVote"; 

Asigna la cadena "giveVote" a la variable functionName. Si giveVote es el nombre de la función, entonces usted tiene que asignar en una de las siguientes maneras:

Si conoce el nombre de la función en tiempo de compilación, entonces se puede

var functionName="giveVote"; 

Pero cree que quiere dinámicamente asigne la función y luego llámelo.Entonces usted tiene que decir

var functionName=window["giveVote"]; 

y luego llamarlo por

functionName(); 

O directamente

window["giveVote"](); 

Esto es posible debido a que cualquier función global se declara en JavaScript (global como en el que no forma parte de cualquier otro objeto), luego se convierte en parte del objeto window.

0

Normalmente no hay una buena razón para usar una secuencia para pasar una referencia de función. Si necesita hacer esto, simplemente asigne la función a una variable. Como las funciones son objetos, es realmente tan fácil como tratarlas como cualquier otra variable.

var giveVote = function() { ... }; 

var someOtherFunction = function(callback) { 
    callback(); 
}; 

someOtherFunction(giveVote); 

En una nota relacionada, setTimeout(functionName, 0) sólo funciona gracias a setTimeout se eval el primer parámetro si se trata de una cadena. Lo mejor es evitar esto por cuestiones de rendimiento y seguridad.

2

Según tengo entendido, tiene el nombre de la función almacenada en la variable functionName. Ahora esto es diferente de mantener una referencia a la función en sí misma. Por lo tanto, no puede usar functionName(), porque functionName se refiere a un objeto String aquí, no a una función.

Por lo tanto, esto es lo que debe hacer, use el functionName para obtener el objeto de la función. Como se sugirió anteriormente, puede usar la ventana [nombre de función] si la función se ha definido en el ámbito de la ventana. Pero en función de cómo está estructurado su código, es muy probable que tenga esta función como miembro de algún otro objeto, y tendría que usar ese objeto para acceder a la función. Por ejemplo, si la variable objContainingFunction se refiere a un objeto que contiene la función con el nombre definido en functionName, entonces se podría llamar a la función usando

objContainingFunction [functionName]().

Y con respecto a su edición -

$ (this) .rules ("ADD", {mehtodName: "^ [a-zA-Z' \ s.] {1,40} $ "});

¿Cuál es exactamente su requisito aquí? Porque, como mencioné anteriormente, methodName es una cadena aquí.

-1

Estoy de acuerdo con la solución proporcionada por Justin, agregando un escenario más aquí.

Incluso puede tomar el nombre de la función de devolución de llamada almacenada en algún objeto & y luego llamarlo.

p. Ej.

var callback = this.objName.getHandlerName() ; //we get the current function to call from some logic 

callback(); //actual call to the function 
Cuestiones relacionadas