Мне было интересно, несмотря на утечку памяти,
Нет утечки памяти, два объекта, которые ссылаются друг на друга, но нигде не связаны, собирают мусор. Объект window
никогда не будет собран, поэтому здесь все равно не имеет значения.
какая польза от циклической ссылки в javascript?
Как и в любом другом языке, они могут использоваться для различных структур, таких как деревья (parent <-> child), связанные списки (left <-> right) и отношения «многие ко многим» (ученики <-> классы) , Отсутствие их усложнит некоторые формы обхода и значительно замедлит работу программ.
Почему window.window является круговой ссылкой?
window
- это не только объект, но и самая глобальная область, в которой все переменные наконец-то ищутся. Когда вы используете любую глобальную переменную, такую как setTimeout
, она ищется в глобальной области видимости и, следовательно, в объекте window
.
window.setTimeout === /*window.*/setTimeout
Теперь, если вы хотите сослаться на глобальный объект, его нужно искать в глобальной области, которая сама является глобальным объектом.
window.window === /*window.*/window
Поэтому только window
уже обращается к циклической ссылке, это причина, по которой глобальный объект может быть найден вообще. В противном случае window
должно быть зарезервированным ключевым словом.