Generazione pulita di diverse funzioni JavaScript 0-airty con corpi leggermente diversi

2

Dire che ho un sacco di funzioni JavaScript simili a:

message = [“000”, “111”, “222”, “333”];

function F0(){
    alert (message[0]);
}

function F1(){
    alert (message[1]);
}

function F2(){
    alert (message[2]);
}

function F3(){
    alert (message[3]);
}

C'è un modo per creare una sorta di modello per questo insieme di funzioni?

Cioè, per dichiarare qualcosa del tipo:

function F<T>(){
   alert (message[T]);
}

La ragione è piuttosto semplice. Nella mia soluzione, ho funzioni molto più complesse che eseguono la stessa azione (sono funzioni di callback per alcuni oggetti XMLHttpRequest). Ogni volta che apporto un cambiamento, deve riflettersi su tutte le funzioni, qualcosa che sto cercando di evitare. Dall'interno della funzione, non posso sapere se è stato chiamato da XMLHttpRequest[5] o XMLHttpRequest[2] , quindi ho creato alcune funzioni simili (per ogni oggetto XMLHttpRequest). Sto cercando un modo per prototipare quelle funzioni, quindi terrò la logica in un unico posto. Finora, non ho trovato un modo per ottenerlo con JavaScript.

Per essere chiari, sto usando quelle funzioni per XmlHttpRequest.onstatechange così quelle sono chiamate senza parametri (qualcosa del tipo: xhr[0].onstatechange = F0; xhr[1].onstatechange = F1; ). Sto cercando un modo per prototipare solo la funzione e di crearne alcune "istanze", differenziate da un indice all'interno di quelle stesse funzioni.

    
posta Alex 26.03.2016 - 12:30
fonte

2 risposte

2

Sì, usa gli argomenti della funzione:

function F(T) { alert(message[T]); }

Se hai bisogno di una funzione che, dato questo "template" può essere successivamente invocata senza argomenti, possiamo usare un closure - restituire una funzione all'interno di una funzione:

function makeF(T) {
  return function F() { alert(message[T]); };
}

// var F1 = makeF(1);
// etc.

I modelli C ++ o i generici Java / C # sono come funzioni di compilazione che vengono principalmente utilizzate per creare una famiglia di tipi. JavaScript non ha in realtà un sistema di tipo in fase di compilazione, o anche un tempo di compilazione, quindi questi concetti non si applicano qui. Possiamo quindi fornire argomenti in fase di esecuzione praticamente allo stesso effetto.

    
risposta data 26.03.2016 - 13:17
fonte
2

Un'altra opzione è function.bind che restituirà una funzione con gli argomenti ad essa associati:

var f1 = F.bind(null, 1)

Vedi - link

    
risposta data 26.03.2016 - 16:41
fonte

Leggi altre domande sui tag