Выбор ответа Senior Модули обновлено

Циклический импорт в ES-модулях

Вопрос

Точка входа a.js. Что произойдёт?

// a.js
import { b } from './b.js';
export const a = 'A';
console.log(b);

// b.js
import { a } from './a.js';
export const b = 'B';
console.log(a);

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: ReferenceError в b.js: a ещё не инициализирована. Модули выполняются в порядке зависимостей: a.js сначала требует b.js, и b.js выполняется первым, пока a.js ещё не выполнен.

Варианты ответа

  1. Выведет A, затем B: модули отработают по порядку
  2. Выведет undefined, затем B, как с недозаполненным экспортом
  3. Бесконечный цикл загрузки: a.js и b.js требуют друг друга
  4. ReferenceError в b.js: a ещё не инициализированаправильный ответ

Разбор

Модули выполняются в порядке зависимостей: a.js сначала требует b.js, и b.js выполняется первым, пока a.js ещё не выполнен. Привязка a уже существует, но const до инициализации в TDZ, и console.log(a) бросает ReferenceError. undefined получился бы с var, а в CommonJS был бы недозаполненный объект экспортов. Бесконечного цикла нет: каждый модуль загружается один раз. Решение: вынести общее в третий модуль или обращаться к значению позже, внутри функции.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.