Циркулярные зависимости не являются проблемой для декларативных импорта/экспорта. В вашем случае, круг минимальной длины, хотя :-)
Решение состоит в том, что import
не импортирует значения в переменную, но это делает переменная а ссылка к экспортируемой переменной. Посмотрите here на пример изменчивой переменной и на this question для точной терминологии.
И это одинаково для объектов пространства имен модулей - их свойства - это просто геттеры, которые разрешают фактическую экспортированную переменную.
Поэтому, когда ваш модуль будет загружен и оценены, выполняются следующие шаги:
- Источник статически анализировали на
export
и import
деклараций построить график зависимостей
- создается Объем модуля
- Так как единственная зависимость вашего модуля сама по себе и что уже инициализируется, ее не нужно ждать
- Переменная
fooModule
создается и создается на основе объект с экспортированными именами модуля, которые, как известно, ["logFoo"]
. Свойство fooModule.logFoo
становится геттером, который будет оценивать переменную logFoo
в области видимости модуля (если вы использовали export {A as B}
, то fooModule.B
разрешится до A
, но в вашем случае оба иена будут совпадать).
- переменных декларации в рамках модуля создание переменного, в вашем случае
logFoo
и объявление функций инициализируются (т.е. logFoo
получает назначение функции)
- Кода модуля выполняются (в вашем случае, ничего не происходит)
Теперь, когда вы вызываете logFoo
в модуль, который импортирует его, fooModule
будет ссылаться на пространство имен, которое содержит logFoo
. No magic :-)
Что вы хотите сделать? – anshuVersatile
Импорт не является обязательным, а разрешение и исполнение являются отдельными. Сначала импорт анализируется и разрешается. К моменту выполнения кода все привязки уже разрешены. – Joseph
Лучшая практика - не делать этого –