Задачи на JS: замыкания, this, Event Loop

↑ 2.1 JavaScript: продвинутый · ← Предыдущая · → Следующая

Обязательно~4 мин чтенияУровень: middle

Зачем это на собесе

Типовые задачи «что выведет код». Решайте, проговаривая правила: hoisting, замыкания, this, порядок очередей.

Задачи

// 1. Замыкания и var
for (var i = 0; i < 3; i++) setTimeout(() => console.log(i), 0);
// 2. this
const obj = { name: "A", regular() { return this.name; }, arrow: () => typeof this };
const f = obj.regular;
console.log(obj.regular(), f(), obj.arrow());
// 3. Event loop
console.log("A");
setTimeout(() => console.log("B"), 0);
Promise.resolve().then(() => console.log("C"));
(async () => { console.log("D"); await 0; console.log("E"); })();
console.log("F");
// 4. Hoisting
console.log(typeof f1, typeof f2);
function f1() {}
var f2 = function () {};
// 5. Приведение типов
console.log([] + [], [] + {}, 1 + "2", "3" - 1, true + true, [] == false, null == undefined, NaN == NaN);
// 6. Замыкание-счётчик
const make = () => { let n = 0; return () => ++n; };
const a = make(), b = make();
console.log(a(), a(), b());
// 7. Promise-цепочка
Promise.resolve(1).then(v => { throw new Error("x"); }).then(() => console.log("A")).catch(() => console.log("B")).then(() => console.log("C"));
// 8. Порядок
setTimeout(() => console.log(1));
new Promise((res) => { console.log(2); res(); }).then(() => console.log(3));
console.log(4);

Как решать

  1. Разделите синхронный код, микрозадачи и макрозадачи.
  2. Определите значение this по способу вызова.
  3. Учитывайте hoisting и TDZ.
  4. Проговаривайте правила вслух: интервьюеру важен ход рассуждений.

Практика

  1. Составьте ещё 10 задач на каждый пункт и решите без запуска.
  2. Разберите ответы с помощью визуализатора (loupe, JS Visualizer).

Связанные темы