Выбор ответа 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 ещё не выполнен.
Варианты ответа
- Выведет
A, затемB: модули отработают по порядку - Выведет
undefined, затемB, как с недозаполненным экспортом - Бесконечный цикл загрузки:
a.jsиb.jsтребуют друг друга - ReferenceError в
b.js:aещё не инициализированаправильный ответ
Разбор
Модули выполняются в порядке зависимостей: a.js сначала требует b.js, и b.js выполняется первым, пока a.js ещё не выполнен. Привязка a уже существует, но const до инициализации в TDZ, и console.log(a) бросает ReferenceError. undefined получился бы с var, а в CommonJS был бы недозаполненный объект экспортов. Бесконечного цикла нет: каждый модуль загружается один раз. Решение: вынести общее в третий модуль или обращаться к значению позже, внутри функции.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.