Usa la variabile JavaScript come nome della funzione?

Ho il seguente codice in Javascript:

jQuery(document).ready(function(){ var actions = new Object(); var actions; actions[0] = 'create'; actions[1] = 'update'; for (key in actions) { // Dialogs var actions[key]+Dialog = function(){ $('#'+actions[key]+'dialog').dialog('destroy'); $('#'+actions[key]+'dialog').dialog({ resizable: false, height:600, width:400, modal: true, buttons: { Cancel: function() { $(this).dialog('close'); } } }); }; } }); 

Voglio creare 2 funzioni in loop (createDialog e updateDialog). Come posso fare questo? In PHP c’è molto semplice $$ var. Ma come rendere variabile variabile in JS non lo so.

Grazie

Come questo:

 actions[key + "Dialog"] = function () { ... }; 

Tuttavia, poiché le funzioni Javascript acquisiscono variabili per riferimento, il tuo codice non funzionerà come previsto.
È necessario definire la funzione interna all’interno di una funzione separata in modo che ognuno ottenga una variabile key (o parametro) separata.

Per esempio:

 var actionNames = [ 'create', 'update' ]; //This creates an array with two items var Dialog = { }; //This creates an empty object for (var i = 0; i < actionNames.length; i++) { Dialog[actionNames[i]] = createAction(actionNames[i]); } function createAction(key) { return function() { ... }; } 

Puoi usarlo in questo modo:

 Dialog.create(...); 

MODIFICARE

Stai tentando di inquinare lo spazio dei nomi globale con più funzioni correlate alla finestra di dialogo.
Questa è una ctriggers idea; è meglio organizzare le tue funzioni in namespace.

Se vuoi davvero perfezionare lo spazio dei nomi globale, puoi farlo in questo modo:

 var actionNames = [ 'create', 'update' ]; //This creates an array with two items for (var i = 0; i < actionNames.length; i++) { this[actionNames[i] + 'Dialog'] = createAction(actionNames[i]); } 

Questo creerà le funzioni globali chiamate createDialog e updateDialog .
In una normale chiamata di funzione, la parola chiave this fa riferimento allo spazio dei nomi globale (in genere l'object window ).

Avrai bisogno di un riferimento all’object scope in cui vuoi creare le funzioni. Se è l’ambito globale puoi usare la window :

 window[ actions[key] + "Dialog" ] = function(){ ... } 

L’ambito globale di javascript è finestra, quindi puoi scrivere:

 var funcName='varfuncname'; window[funcName]=function() { alert('HI!'); } 

Ora puoi chiamarlo come window[funcName](); , window['varfuncname'](); o varfuncname();

Devi combinare le risposte di SLaks e RoToRa:

 var actionNames = [ 'create', 'update' ]; //This creates an array with two items for (var i = 0; i < actionNames.length; i++) { window[ actionNames[i] + 'Dialog' ] = function() { $('#'+ actionNames[i] +'dialog').dialog('destroy'); $('#'+ actionNames[i] +'dialog').dialog({ resizable: false, height:600, width:400, modal: true, buttons: { Cancel: function() { $(this).dialog('close'); } } }); } } 

Dal momento che lo stai eseguendo nel gestore di eventi pronto per il documento, la "questa" variabile si riferirebbe al documento, non alla finestra.

Penso che tu stia cercando di fare qualcosa che non devi fare in JavaScript. In PHP, il passaggio di funzione è un po ‘un kludge. In JavaScript è elegante e indolore.

Come pensi di chiamare queste funzioni in seguito? Immagino che tu abbia questi nomi di funzioni hard-coded nel tuo codice HTML negli attributi ‘onclick’. JavaScript hard-coding nel tuo codice HTML tramite gli attributi on* è una ctriggers idea. Se è quello che stai facendo, devi creare variabili nell’ambito globale (un’altra pratica che è meglio evitare). Nel browser, l’object globale è una window . Se si definisce una proprietà sulla window , la funzione sarà disponibile globalmente:

 $(document).ready(function() { var myNames = [ 'create', 'destroy' ]; for (var i = 0; i < myNames.length; i++) { window[myNames[i] + 'Dialog'] = function() { alert('Hello'); }; } }); 

Ciò presuppone che tu abbia attributi onclick nel tuo codice HTML che corrispondono ai nomi delle funzioni che stai creando.

Un modo migliore per farlo sarebbe quello di creare le funzioni semplicemente collegandole agli eventi, senza nemmeno assegnarle alle variabili:

 $(document).ready(function() { $('#createdialog, #destroydialog').each(function() { $(this).click(function() { alert('Hello'); }); }); }); 

Ciò renderà il tuo JavaScript e il tuo HTML sempre più piccoli e puliti.