Что такое среда исполнения JavaScript
Что проверяют
Понимаете ли вы, что язык и окружение это разные вещи. За вопросом стоит умение объяснить, почему setTimeout, fetch и DOM не описаны в спецификации языка, почему один и тот же код ведёт себя по-разному в браузере и на сервере и кто на самом деле исполняет асинхронный колбэк.
Как отвечать
Среда исполнения это движок плюс всё, что даёт ему хост. Движок (V8, SpiderMonkey, JavaScriptCore) отвечает за сам язык: разбор кода, компиляцию, стек вызовов, кучу, сборку мусора, очередь микрозадач.
Хост добавляет остальное: набор API (DOM, BOM, fetch, таймеры в браузере; файловая система, сокеты, процесс в серверном рантайме), цикл событий с очередью задач, загрузчик модулей.
Ключевая мысль: выполнение JS однопоточное, но асинхронность обеспечивает не движок, а среда. Таймер отсчитывает хост, по готовности колбэк попадает в очередь задач, и цикл событий заберёт его только тогда, когда стек опустеет. Промисы идут в очередь микрозадач, она разбирается целиком после текущей задачи и до отрисовки.
setTimeout(() => console.log("timeout"), 0);
Promise.resolve().then(() => console.log("micro"));
console.log("sync");
// sync, micro, timeoutСред несколько: браузер, серверные рантаймы, веб-воркеры, окружение расширений. Практический вывод: код, завязанный на window или document, не переносится на сервер, и наоборот.
Где спотыкаются
Считают движок и среду синонимами, приписывают V8 работу с DOM и потом не могут объяснить, почему в серверном рантайме того же движка никакого документа нет.
Говорят «JavaScript однопоточный» без уточнения. Однопоточно выполнение кода, а сетевые запросы, таймеры и часть работы браузера идут параллельно, средой.
Не разделяют задачи и микрозадачи, поэтому не могут предсказать порядок вывода в примере выше и не видят, почему длинная цепочка промисов способна задержать отрисовку кадра.