2009-06-09 1 views
65

Sto lavorando per creare dinamicamente alcuni Javascript che verranno inseriti in una pagina Web mentre viene costruita.Come si chiama un metodo con nome dinamico in Javascript?

Il Javascript verrà utilizzato per compilare una casella di riepilogo in base alla selezione in un'altra casella di riepilogo. Quando viene cambiata la selezione di una listbox, verrà chiamato un nome di metodo in base al valore selezionato della casella di riepilogo.

Ad esempio:

Listbox1 contiene:

Colors
Forme

Se è selezionato 'Colori' allora chiamerà un metodo "populate_Colours" che popola altro listbox.
Per chiarire la mia domanda: come faccio a fare che chiamata "populate_Colours" in Javascript?

+0

I' d sconsigliamo questo in favore di avere filiali locali in un unico metodo "popolare". Lo renderebbe più testabile e sembrerebbe meno "hacky" –

+0

vedere la mia risposta qui. [chiama per nome in javascript] (https://stackoverflow.com/a/46090820/7771019) –

risposta

142

Supponendo che il metodo "populate_Colours" si trovi nello spazio dei nomi globale, è possibile utilizzare il codice seguente, che sfrutta sia l'accesso a tutte le proprietà dell'oggetto come se fosse un array associativo sia che tutti gli oggetti globali siano effettivamente proprietà dell'oggetto host window.

var method_name = "Colours"; 
var method_prefix = "populate_"; 

// Call function: 
window[method_prefix + method_name](arg1, arg2); 
+6

Grazie per la risposta. Il bit "window" mi ha davvero gettato fino a quando ho cercato su Google e ho scoperto che gli oggetti globali fanno parte dell'oggetto window. Ora ha senso! Grazie. FYI Ho trovato una buona pagina su di esso qui http://devlicio.us/blogs/sergio_pereira/archive/2009/02/09/javascript-5-ways-to-call-a-function.aspx –

+0

Felice aiutato! Dovresti accettare questa risposta se ha funzionato per te – Triptych

+0

Ho fatto qualcosa di simile, tranne che le funzioni che avevo scelto erano nello spazio dei nomi "fn" di jQuery. Ad esempio, '$ .fn [method_prefix + method_name] (arg1, arg2);' – codecraig

27

Come sottolinea Trittico, è possibile chiamare qualsiasi funzione di ambito globale trovandola nel contenuto dell'oggetto host.

Procedimento pulitore, che inquina namespace globale molto meno, è quello di mettere esplicitamente le funzioni in un array direttamente con:

var dyn_functions = []; 
dyn_functions['populate_Colours'] = function (arg1, arg2) { 
       // function body 
      }; 
dyn_functions['populate_Shapes'] = function (arg1, arg2) { 
       // function body 
      }; 
// calling one of the functions 
var result = dyn_functions['populate_Shapes'](1, 2); 
// this works as well due to the similarity between arrays and objects 
var result2 = dyn_functions.populate_Shapes(1, 2); 

Questa matrice potrebbe anche essere una proprietà di un oggetto diverso da quello globale oggetto host significa che puoi creare efficacemente il tuo spazio dei nomi come fanno molte librerie JS come jQuery. Ciò è utile per ridurre i conflitti se/quando si includono più librerie di utilità separate nella stessa pagina e (altre parti del progetto permettendo) può rendere più facile il riutilizzo del codice in altre pagine.

Si potrebbe anche usare un oggetto in questo modo, che si potrebbe trovare più pulito:

var dyn_functions = {}; 
dyn_functions.populate_Colours = function (arg1, arg2) { 
       // function body 
      }; 
dyn_functions['populate_Shapes'] = function (arg1, arg2) { 
       // function body 
      }; 
// calling one of the functions 
var result = dyn_functions.populate_Shapes(1, 2); 
// this works as well due to the similarity between arrays and objects 
var result2 = dyn_functions['populate_Shapes'](1, 2); 

Si noti che sia con un array o un oggetto, è possibile utilizzare entrambi i metodi di impostazione o accedere alle funzioni, e può ovviamente memorizza anche altri oggetti. È possibile ridurre ulteriormente la sintassi di entrambi i metodi per contant che non è quella Synamic utilizzando la notazione letterale JS in questo modo:

var dyn_functions = { 
      populate_Colours:function (arg1, arg2) { 
       // function body 
      }; 
     , populate_Shapes:function (arg1, arg2) { 
       // function body 
      }; 
}; 

Edit: ovviamente per i più grandi blocchi di funzionalità è possibile espandere la sopra per il molto comune "modello di modulo" che è un modo popolare per incapsulare le caratteristiche del codice in modo organizzato.

+0

È un bel modo per tenerlo pulito. Come potrei chiamare il metodo? La finestra [dyn_functions ['populate_Colours'] (arg1, arg2) funzionerebbe? –

+0

Rispondere alla mia domanda - Ho appena testato la finestra [dyn_functions ['populate_Colours'] (arg1, arg2)]; e funziona davvero. –

+1

non avresti bisogno della finestra – epascarello

1

Ciao provare questo,

var callback_function = new Function(functionName); 
callback_function(); 

gestirà i parametri stesso.

+0

errore di riferimento non rilevato - functionName non è definito – brianlmerritt

+0

@brianlmerritt è necessario definire il valore per 'functionName' ... il responder ha assunto che si era già definito tale. – GoldBishop

7

si può fare in questo modo:

function MyClass() { 
    this.abc = function() { 
     alert("abc"); 
    } 
} 

var myObject = new MyClass(); 
myObject["abc"](); 
1

per una semplice funzione javascript, possiamo usare-

var function_name='additionFunction'; 
var argMap={"name":"yogesh"}; 
var argArray=[{"name":"yogesh"}]; 

window[function_name](argMap); 

o

window[function_name](argArray); 

o

window[function_name](argMap,argArray); 

a condizione che la cosiddetta funzione esista e abbia tali parametri nell'implementazione effettiva.

-1

prova con questo:

var fn_name = "Colours", 
fn = eval("populate_"+fn_name); 
fn(args1,argsN); 
+0

Quali sono le implicazioni dell'uso di questo modello? Ho letto che la funzione 'eval' ha alcuni effetti collaterali strani relativi al suo uso. Generalmente cerco di starne lontano, a meno che non sia l'ultima risorsa. – GoldBishop

3

Suggerirei NON da usare global/window/eval per questo scopo.
Invece, fare in questo modo:

definire tutti i metodi come proprietà di Handler:

var Handler={}; 

Handler.application_run = function (name) { 
console.log(name) 
} 

Ora chiamare in questo modo

var somefunc = "application_run"; 
Handler[somefunc]('jerry'); 

uscita: jerry