Что такое функция обратного вызова (callback) и когда она вызывается в JavaScript
Что проверяют
Понимаете ли вы, что функция в JavaScript это значение, и знаете ли, кто и в какой момент вызывает переданную функцию. Слова «когда вызывается» в вопросе не случайны: за ними стоит разговор про цикл событий, поэтому ответ «колбэк это про асинхронность» интервьюера не устроит.
Как отвечать
Колбэк это функция, переданная в другой код аргументом, чтобы тот вызвал её сам. Дальше важно разделить два случая.
Синхронные колбэки вызываются немедленно, внутри того же вызова, и порядок строк не меняется:
[1, 2, 3].map((n) => n * 2); // колбэк отработал три раза до следующей строки
arr.sort(compare);Асинхронные вызываются позже, когда произойдёт событие: сработает таймер, придёт клик, ответит сеть. Между ними тоже есть разница по очереди: обработчики таймеров и событий попадают в очередь макрозадач, а колбэк в then у промиса и queueMicrotask в очередь микрозадач, которая разбирается раньше, сразу после текущей синхронной работы.
Полезно упомянуть соглашение с ошибкой первым аргументом, пришедшее из серверного кода, и причину появления промисов: цепочка вложенных колбэков плохо читается и легко теряет обработку ошибок.
Где спотыкаются
Ставят скобки при передаче. Запись setTimeout(greet(), 2000) вызывает функцию сразу и отдаёт таймеру её результат; передавать нужно имя, а обёртку в стрелочную функцию делать только когда нужны аргументы.
Теряют this. Метод объекта, переданный обработчиком напрямую, вызывается уже не на объекте, и внутри this оказывается совсем другим; спасают стрелочная функция и bind.
Оборачивают асинхронный вызов в try и считают ошибки обработанными. Блок завершится раньше, чем колбэк выполнится, поэтому ошибку ловят внутри самого колбэка, а в промисах через catch.