2010-10-08 7 views
6

Ho una variabileCome chiamare la funzione utilizzando il valore memorizzato in una variabile?

var functionName="giveVote"; 

Che cosa devo fare è, voglio chiamare la funzione memorizzata in var functionName. Ho provato a usare functionName(); . Ma non funziona. Per favore aiuto.

Modifica Basato sullo stesso problema, ho

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

regole è una funzione che prende Predifined nomeMetodo :, qui ho hardcoded txtInf. Ma voglio fornire una variabile javascript qui, per rendere generico il mio codice. var methodName = "txtInf";

Qui voglio valutare methodName prima di essere utilizzato nella funzione delle regole.

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

In che modo è correlato a .NET? –

risposta

10

Avete una manciata di opzioni - due di base includono window[functionName]() o setTimeout(functionName, 0). Dai a quelli un colpo.

Modifica: se la variabile è solo il nome stringa di una funzione, utilizzare quelle; altrimenti, se siete in grado di assegnare in realtà una funzione di riferimento alla variabile (ad esempio, var foo = function() {};), è possibile utilizzare il foo() la notazione, o foo.apply(this, []), ecc

Edit 2: Valutare methodName in luogo prima $(this).rules() cottura , si era appena applicare la prima sintassi sopra (utilizzando l'oggetto window), in questo modo:

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

Penso che sia quello che stai chiedendo - in caso contrario, si prega di chiarire un po 'di più e sarò felice riscrivere una soluzione.

+0

Bello, grazie per aver menzionato setTimeout, dovrebbe funzionare. –

+0

Si prega di vedere le modifiche. –

+0

Non sai cosa intendi. Stai dicendo che la regex dovrebbe essere passata come argomento alla funzione?O che definisce un modello per la nomenclatura? – mway

1

Perché non basta passare la stringa direttamente a dove si desidera chiamare la funzione? Perché conservarlo per primo? Ciò sembra più confuso in quanto è un altro livello di riferimento indiretto (e, in definitiva, può rendere il tuo codice più difficile da eseguire il debug).

Ad esempio:

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

non vedo un vantaggio particolare a fare quello che stai cercando di fare.

7
var functionName="giveVote"; 

Assegna la stringa "giveVote" alla variabile functionName. Se giveVote è il nome della funzione, allora dovete assegnare in uno dei seguenti modi:

Se si conosce il nome della funzione al momento della compilazione, allora si può

var functionName="giveVote"; 

Ma io pensa di voler dinamicamente assegnare la funzione e quindi chiamarla.Poi bisogna dire che

var functionName=window["giveVote"]; 

e poi chiamarla con

functionName(); 

O direttamente

window["giveVote"](); 

Questo è possibile perché ogni funzione globale si dichiara in JavaScript (globale come in non parte di qualsiasi altro oggetto), quindi diventa parte dell'oggetto window.

0

Normalmente non è una buona ragione per utilizzare una stringa per passare un riferimento di funzione in giro. Se è necessario, assegnare la funzione a una variabile. Poiché le funzioni sono oggetti, è davvero semplice trattarle come qualsiasi altra variabile.

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

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

someOtherFunction(giveVote); 

In una nota correlata, setTimeout(functionName, 0) funziona solo perché setTimeout sarà eval il primo parametro, se si tratta di una stringa. È meglio evitare questo per problemi di prestazioni e sicurezza.

2

Da quello che ho capito, il nome della funzione è memorizzato nella variabile functionName. Ora questo è diverso dal tenere un riferimento alla funzione stessa. Pertanto, non è possibile utilizzare functionName(), poiché functionName fa riferimento a un oggetto String qui, non a una funzione.

Quindi, ecco cosa è necessario fare, utilizzare la funzioneNome per ottenere l'oggetto funzione. Come suggerito sopra, puoi usare window [functionName] se la funzione è stata definita nell'ambito della finestra. Ma in base a come è strutturato il tuo codice probabilmente avresti questa funzione come membro di qualche altro oggetto, e avresti bisogno di usare quell'oggetto per accedere alla funzione. Ad esempio, se la variabile objContainingFunction si riferisce ad un oggetto che contiene la funzione con il nome definito nella functionName, allora si potrebbe chiamare la funzione mediante

objContainingFunction [functionName]().

E per quanto riguarda la tua modifica -

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

Qual è esattamente il tuo requisito qui? Perché, come ho detto prima, methodName è una stringa qui.

-1

Sono d'accordo con la soluzione fornita da Justin, aggiungendo qui uno scenario in più.

È anche possibile prendere il nome della funzione di richiamata memorizzato in alcuni oggetti & quindi chiamarlo.

ad es.

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

callback(); //actual call to the function 
Problemi correlati