35.5 Passare funzione ad altra funzione (callback)

In questa lezione passeremo una funzione come parametro di un altra, in questo caso, non essendo la funzione un dato primitivo, quando viene chiamata come parametro di un altra funzione, viene passata per riferimento, infatti se venisse modificata la funzione da quella chiamante, la funzione viene modificata.

Creiamo una funzione outPutObject() che riceve come parametro un oggetto e cicla i suoi valori stampandoli nella console.

function outPutObject(obj) {
    for(let chiave in obj ) {
        console.log(obj[chiave]);
    }
}

Da notare la sintassi for in che può riassumersi col significato di: per ogni chiave che trovo nell’oggetto, eseguo un’operazione, nel nostro caso stampo i valori nella console.

Creiamo ora una funzione processObject() che riceverà un oggetto da processare ed una funzione di callback ovvero una funzione passata come parametro, che nel nostro caso sarà la funzione outPutObject().

function processObject(myObject, callback) {
    callback(myObject);
}

Il parametro callback (posso chiamarlo come preferisco), andrà a lavorare sul primo parametro, cioè l’oggetto.

Creiamo l’oggetto objTest:

let objTest = { name:'Test', lastName:'Test2', age:36 };

Questa è una sintassi per creare un oggetto, ma approfondiremo l’argomento più avanti.

Passiamo l’oggetto alla funzione processObject() che verrà a sua volta processato dalla funzione di callback passata come secondo parametro:

processObject(objTest, outPutObject);

Eseguendo il codice otterrò stampati in console i valori del mio oggetto, la funzione processObject() delega l’elaborazione dell’oggetto alla funzione di callback.

Aggiungiamo alla funzione di callback anche la stampa in console della chiave per una lettura migliore:

function outPutObject(obj) {
    for(let chiave in obj ) {
        console.log( chiave + '=' + obj[chiave]);
    }
}

Come abbiamo dichiarato prima, essendo la funzione di callback passata per riferimento, ho la possibilità di modificarla all’interno di processObject(), proviamo ad aggiungere da processObject() alla callback un variabile testFunction che esegue una funzione anonima che stampa un altra riga in console

function processObject(myObject, callback) {
    callback(myObject);
    callback.testFunction = function () {
        console.log('Chiamato testFunction');
    }
}

Richiamando esternamente la proprietà testFunction della funzione outPutObject() otterrò la stampa, anche se modificata dalla callback della funzione processObject()

outPutObject.testFunction();

Le funzioni in js sono oggetti di prima classe e possono essere passati come parametri, possono essere modificati, eseguiti o richiamati. Grazie a questo paradigma funzionale di js ho la possibilità di assegnare un compito specifico ad ogni funzione come nel nostro caso la funzione outPutObject() ha il compito di ciclare l’oggetto.