Как правило, функция обратного вызова используется, когда другая функция, которую вы вызвали, завершается (как вы указали в своем вопросе). Хорошим примером этого являются запросы AJAX: большинство библиотек имеют функцию, которая позволяет отправлять запрос на сервер в фоновом режиме, не обновляя страницу (для этого используется AJAX). Обычно вы предоставляете две функции обратного вызова для этой функции AJAX: функцию успеха и функцию отказа.
Если этот запрос выполняется успешно, он вызывает функцию успеха, чтобы ваш код мог делать то, что ему нужно; например, он может обновить часть страницы, сделать какую-то анимацию или предупредить пользователя о том, что его информация была сохранена. С другой стороны, в случае сбоя функция обратного вызова, вероятно, предупредит пользователя о том, что его данные не были сохранены, и что им следует повторить попытку.
Функции обратного вызова позволяют разработчикам библиотек создавать очень общий код, который могут использовать другие, а затем настраивать их под свои нужды.
Ниже приведен код jQuery, демонстрирующий приведенный выше пример (этот код не будет работать, так как URL не существует):
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);
}
);
РЕДАКТИРОВАТЬ: В начале я сказал: "В общем ...". В действительности, обратные вызовы используются гораздо больше, чем просто после завершения функции. Как указано в других ответах, его можно использовать в любом месте внутри функции: начало, середина, конец. Основная идея заключается в том, что разработчик кода может не знать, как ВЫ собираетесь использовать его код. Таким образом, он делает это очень общим и дает вам возможность делать с данными все, что вам нужно.
Хорошим примером этого является метод jQuery.each , который позволяет передавать обратный вызов, который будет выполняться для каждого из элементов в «массиве» (я говорю «массив», потому что он на самом деле может итерации по многим вещам, которые могут или не могут быть фактическими массивами).
<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');
});
Итак, из этого примера видно, что разработчики jQuery реализовали метод .each и позволяют нам делать все, что мы хотим, с каждой ссылкой, к которой он вызывается.