Колбэки
Чашка — абзац #cup, и она начинается как blank. Таймера чайника на этой странице нет.
serve берёт заказ и функцию. Эта функция — колбэк: ты её отдаёшь, а serve вызывает. Вызов происходит до возврата serve, поэтому следующая строка уже видит напиток. Строка читается lida tea / poured.
Не чайник
Прошлая страница сразу писала cold и hot только через 400 миллисекунд. Её строка была cold / hot / 3. Таймер ждёт. serve не ждёт. Если ищешь setTimeout, это не та стойка.
Вопрос: кто вызывает функцию, которую ты передал?
Имя параметра — только имя
Внутри serve параметр зовут done. На месте вызова у функции нет имени. serve имя не важно. Важно, что получена функция и что её вызывают с одним аргументом: заказ плюс слово tea.
Вызов до возврата
done(order + " tea") выполняется, чашка наполняется, и только потом serve заканчивается. Журнал под вызовом уже содержит напиток.
function serve(order, done) {
done(order + " tea");
}
let cup = document.getElementById("cup");
serve("lida", function (drink) {
cup.textContent = drink;
});
console.log(cup.textContent);
Журнал — lida tea. Чашка не осталась blank, и никто не ждал.
Забыть вызов
Этот serve собирает напиток и останавливается. done он не вызывает. Функция, которую ты передал, так и лежит. Чашку до вызова поставили в blank, и она blank остаётся.
function serve(order, done) {
order = order + " tea";
}
let cup = document.getElementById("cup");
cup.textContent = "blank";
serve("lida", function (drink) {
cup.textContent = drink;
});
console.log(cup.textContent);
Журнал — blank. Ошибка не бросается. Колбэк, который не вызвали, просто не выполняется. Строка напитка была собрана, и её никто не принял.
Вторая функция, после первой
serve может взять две функции. Сначала вызывает done с напитком. after вызывает только когда этот вызов вернулся. after напиток не получает. Только отмечает, что налили.
function serve(order, done, after) {
done(order + " tea");
after();
}
let seen = [];
serve(
"lida",
function (drink) {
seen.push(drink);
},
function () {
seen.push("poured");
}
);
console.log(seen.join(" / "));
Журнал — lida tea / poured. Поменяй два вызова внутри serve — слова поменяются. Порядок — это порядок вызовов, не порядок, в котором ты написал выражения функций.
Что склеивает страница
Страница использует второй serve, с done и after. Кладёт напиток, потом poured и пишет строку. Задержки между ними нет.
Строка под чашкой
Скрипт в конце body. serve вызывает обе функции до склейки строки.
<!DOCTYPE html>
<html>
<head>
<title>serve-cup — page</title>
</head>
<body>
<p id="cup">blank</p>
<p id="line">…</p>
<script>
function serve(order, done, after) {
done(order + " tea");
after();
}
let seen = [];
serve(
"lida",
function (drink) {
seen.push(drink);
},
function () {
seen.push("poured");
}
);
document.getElementById("line").textContent = seen.join(" / ");
document.getElementById("cup").textContent = seen[0];
</script>
</body>
</html>
Строка читается lida tea / poured. Чашка показывает lida tea. Слово blank исчезло. cold / hot / 3 — прошлая страница.
У стойки
- Передай
serveфункцию и дай вызвать её с напитком. Журнал — lida tea. - Возьми
serve, который никогда не вызываетdone. Журнал остаётся blank. - Передай
doneиafter. Журнал — lida tea / poured. - Прочитай строку страницы: lida tea / poured.
Промахи у стойки
Чашка показывает напиток или остаётся blank. Счёт интервала она не показывает.
- Ждать, что журнал под
serveвсё ещё blank, хотяdoneуже вызван - Думать, что колбэк выполнится, даже если
serveего не вызывает - Ждать 400 миллисекунд ради lida tea
- Поставить poured перед напитком, вызвав
afterпервым - Читать строку как cold / hot / 3
Оставь это
- Колбэк — функция, которую ты передаёшь, чтобы её вызвал кто-то другой
serveвызываетdoneдо возврата, поэтому следующая строка уже видит lida tea- Если
doneне вызван, чашка остаётся blank и ошибки нет afterвыполняется только после возвратаdone- Строка страницы — lida tea / poured
🧠 Проверьте Свои Знания
Проверьте Свои Знания
Бросьте себе вызов с помощью этой интерактивной викторины и узнайте, насколько хорошо вы понимаете тему
📝 Инструкции
- Внимательно прочитайте каждый вопрос
- Выберите лучший ответ на каждый вопрос
- Вы можете пересдавать тест столько раз, сколько захотите
- Ваш прогресс будет показан вверху