In generale, una funzione di richiamata viene utilizzata una volta terminata un'altra funzione chiamata (proprio come indicato nella domanda). Un buon esempio di ciò sono le richieste AJAX: la maggior parte delle librerie ha una funzione che consente di inviare una richiesta al server in background senza aggiornare la pagina (questo utilizza AJAX). In genere si forniscono due funzioni di callback a questa funzione AJAX: una funzione di successo e una funzione di errore.
Se questa richiesta ha esito positivo, chiama la funzione di successo in modo che il codice possa fare ciò di cui ha bisogno; ad esempio, potrebbe aggiornare parte della pagina, fare una sorta di animazione o avvisare l'utente che le sue informazioni sono state salvate. D'altra parte, se fallisce, la funzione di callback probabilmente avviserà l'utente che i suoi dati non sono stati salvati e che dovrebbero riprovare.
Le funzioni di richiamata consentono agli sviluppatori di librerie di creare codice molto generico che altri possono utilizzare e quindi personalizzare in base alle proprie esigenze.
Di seguito è riportato un codice jQuery visualizzare l'esempio di cui sopra (questo codice non funzionerà come l'URL non esiste):
jQuery.ajax(
url: '/mywebsite/somepage.php',
success: function itWorked(returnedData) {
// This is the success function and will be called only if the ajax call
// completes succesfully
alert('Yay it worked! ' + returnedData);
},
error: function itFailed(originalRequest, textStatus, errorThrown) {
// This is the error function and will only be called if the ajax call
// has an error
alert('It failed! ' + textStatus + '. ' + errorThrown);
}
);
EDIT: All'inizio, ho detto, " In generale...". In realtà, i callback vengono utilizzati per molto più che quando termina una funzione. Come dichiarato in altre risposte, può essere utilizzato ovunque all'interno di una funzione: inizio, metà, fine. L'idea di base è che lo sviluppatore del codice potrebbe non sapere come userete il codice HIS. Quindi, lo rende molto generico e ti dà la possibilità di fare tutto ciò che ti serve con i dati.
Un buon esempio di questo è il metodo jQuery.each che permette di passare in un callback che verrà eseguito su ciascuno degli elementi della "matrice" (dico array che può effettivamente iterare su molte cose che può o potrebbero non essere array effettivi).
<a href='someurl.html' class='special_link'>Some URL</a>
<a href='anotherurl.html' class='special_link'>Another URL</a>
<a href='onelasturl.html' class='special_link'>One Last URL</a>
// The following code says: execute the myEachCallbackFunction on every link
// that has a class of 'special_link'
$('a.special_link').each(function myEachCallbackFunction(i) {
// The link variable will contain the object that is currently
// being iterated over. So, the first time through, it will hold
// the 'someurl.html' link, the second time it will hold the
// 'anotherurl.html' link, and the last time it will hold the
// 'onelasturl.html' link
var link = $(this);
// Change the background color of each link to be red
link.css('background-color', 'red');
});
Quindi, possiamo vedere da questo esempio che gli sviluppatori di jQuery implementato il metodo di .each e ci permettono di fare tutto ciò che vogliamo per ogni link che è chiamata.
Date un'occhiata a questa risposta: http://stackoverflow.com/questions/2070275/javascript-closures-and-callbacks/2070389#2070389 –
bel link Thanks a lot. – MEM