Перейти к содержимому

Обзор раздела — Ядро JavaScript

JavaScript — единственный язык, который выполняется буквально везде: в браузере пользователя, на Node.js-сервере, в edge-функции на CDN и даже внутри PostgreSQL-расширений. Но за предсказуемым синтаксисом кроются механизмы, которые ломают интуицию у каждого второго разработчика: замыкания, this, прототипы, асинхронность. В краткой версии учебника мы бегло прошлись по этим темам — теперь разбираем каждую до дна.

Представь типичную продакшен-боль: интерфейс подтормаживает, память растёт, события срабатывают в «случайном» порядке, стейт React «не тот». В девяти случаях из десяти корень проблемы — не фреймворк, а непонимание того, как устроен сам язык под капотом. Event Loop объясняет, почему тяжёлый расчёт блокирует рендеринг. Замыкания объясняют, почему замыкание на большой объект не даёт сборщику мусора его удалить. Понимание прототипов объясняет, почему методы классов не дублируются в памяти.

Ты не сможешь «пройти мимо» этих механизмов — они работают в каждой строчке твоего кода, независимо от того, знаешь ты о них или нет. Разница лишь в том, что разработчик, который их понимает, чинит баг за час, а не за неделю.

Раздел построен как лестница: каждая глава опирается на предыдущую. Не перескакивай — терминология накапливается.

1. Контекст выполнения и Lexical Environment — фундамент всего. Стек вызовов, лексические окружения, цепочка областей видимости, hoisting var/let/function, временная мёртвая зона (TDZ). Поняв ментальную модель из этой главы, ты сможешь предсказывать, какая переменная где видна и почему код «видит» функцию до её объявления.

2. Замыкания в деталях — прямое следствие Lexical Environment. Механика замыканий, приватное состояние без классов, фабрики, паттерн «модуль», классическая ловушка с циклом var и утечки памяти через замыкания. Это глава, которая превращает «магию» в инженерный инструмент.

3. this и контекст вызова — пять правил определения this, bind/call/apply, стрелочные функции и их лексический this, потеря контекста в колбэках, привязка методов классов. После этой главы this перестанет быть рулеткой.

4. Прототипы и классы — как устроена цепочка прототипов, Object.create, геттеры и сеттеры, что на самом деле делает class из ES6 под капотом, приватные поля #, статика, примеси.

5. Event Loop в браузере — call stack, микрозадачи, макрозадачи, requestAnimationFrame, этапы рендеринга и большая задача «предскажи порядок вывода». Отдельно — чем браузерный цикл отличается от Node.js.

6. Promise под капотом — состояния и переходы, then-цепочки, промисификация колбэков, комбинаторы all/race/allSettled/any, обработка ошибок, микрозадачи и async-стек трейсов.

7. async/await, AbortController, top-level await — как await работает поверх промисов, параллельность против последовательности в циклах, отмена операций через AbortController и AbortSignal.timeout, top-level await и async-генераторы с for await.

8. Память: утечки, GC, WeakRef — mark-and-sweep и reachability, типичные утечки (таймеры, слушатели, замыкания, кэши), работа с Memory Profiler в DevTools, WeakMap/WeakRef/FinalizationRegistry и краткий обзор оптимизаций V8.

  1. Код запускай. Каждый пример можно скопировать в консоль браузера или в Node.js. Предсказывай результат до запуска — это главное упражнение раздела.
  2. Пиши руками. В конце каждой главы — раздел «Практика» с заданиями от простых к сложным. Критерий результата указан прямо в задании.
  3. Повторяй сам себе. Закрыв глава, попробуй объяснить механизм вслух, как будто собеседуешь джуниора. Не получилось — вернись к разделу.

Для раздела достаточно любого современного браузера и Node.js 20+:

Окно терминала
node --version # проверь версию, нужна 20+ для top-level await в .mjs
node файл.js # запуск скрипта
node --watch # режим с автоперезапуском (Node 18.11+)

Полезно держать открытой вкладку DevTools → Sources → Snippets — там удобно запускать и отлаживать примеры без перезагрузки страницы.