callback-функции, сокращенно "коллбеки", по-русски "функции обратного вызова" - это функции, которые передаются получателю, чтобы получатель их мог вызвать с какой-нибудь целью. Применение таких функций проще пояснить на примерах.
Во-первых, функции обратного вызова могут использоваться для настройки обобщенных алгоритмов. Рассмотрим, например, метод filter у массива. Этот метод создает новый массив, состоящий из элементов исходного, удовлетворяющих какому-то условию. Функция обратного вызова тут задает это самое условие.
Этот метод обычно реализуется браузером, но если бы его не было - то нечто подобное можно было бы реализовать вот так (более точную реализацию можно увидеть по ссылке выше):
Array.prototype.filter = function(callback)
{
var result = [];
for (var i=0, len = this.length; i < len; i++)
{
if (callback(this[i]))
{
result.push(this[i]);
}
}
return result;
}
Использование:
var x = [1,2,3,7,8,9];
var y = x.filter(t => t%2 == 0); // фильтруем чётные
console.log(y); // [2,8]
Во-вторых, функции обратного вызова могут использоваться для отложенного возврата значения. Код, в котором используется этот прием, называют асинхронным.
function loadData(callback) {
fetch("/some/api/url", function (response) {
response.json().then(callback);
})
}
loadData(d => console.log(d));
Здесь используется функция fetch для выполнения ajax-запроса к некоторому API. Кстати, эта функция сама по себе тоже асинхронная, поэтому в примере вы видите две разных callback-функции: одна внутри loadData, вторая - снаружи.
Поскольку запрос к серверу выполняется относительно долго- не существует другого способа получить его результат кроме как передав callback для его обработки. Поэтому довольно часто один callback вызывает другой, а тот - третий. Неограниченное разрастание колбеков в коде называют callback hell.
Более подробно про асинхронность я отвечал тут:
Как вернуть значение из события или из функции обратного вызова?
В-третьих, callback может использоваться для уведомления о событии. Сюда относятся, собственно, все события.
Каждый раз когда вы пишите someElement.onclick = ..., someElement.addEventListener(...) или просто <a onclick=...> - вы создаете callback и передаете его элементу.
sumвызывается сразу, а не какcalback, а в функцииblabla, соответственно, он не определен. – Алексей Шиманский May 16 '17 at 14:52sumсразу вызывается? не могли бы показать? Все я понял)callback()сразу вызывается – Cerej May 16 '17 at 14:56sumвызывается сразу, а не передается как параметр..... должно быть отдалёёёёёённо что-то такое: https://jsfiddle.net/e8s7bkau/ – Алексей Шиманский May 16 '17 at 15:03blablaнужен вызовcallback(). А иначе, зачем это все? – May 16 '17 at 15:16let s = callback(a, b);– Grundy May 16 '17 at 15:16