Как понять сферы JS

В спецификации ECMAScript существует понятие "царств":

Прежде чем он будет оценен, весь код ECMAScript должен быть связан с областью. Концептуально область состоит из набора внутренних объектов, глобальной среды ECMAScript, всего кода ECMAScript, который загружается в рамках этой глобальной среды и других связанных состояний и ресурсов.

В книге Rauschmayer "Говорящий JavaScript" автор пишет об объектах, которые могут пересекать сферы:

В веб-браузерах каждый кадр и окно имеют свою собственную область с отдельными глобальными переменными. Это препятствует тому, чтобы instanceof работал на объекты, пересекающие сферы.

Что именно представляет собой "царство"? Что еще, кроме фрейма, может отделить код веб-сайта другому царству и каковы последствия?

Ответы

Ответ 1

В справочнике по языку используются абстрактные термины, поскольку среды JavaScript могут сильно различаться. В браузере окно (фрейм, окно, открытое с помощью window.open() или просто простая вкладка браузера) является областью. Веб-работник - это другая сфера, нежели окно, но это сфера. То же самое касается сервисных работников.

Для объекта возможно пересечение границ области, потому что окна, открытые из общего базового окна, могут взаимодействовать через вызовы функций и простые ссылки на переменные. Упоминание об instanceof в той цитате, которую вы цитировали, имеет к этому отношение. Рассмотрите этот код в окне <iframe>:

window.parent.someFunction(["hello", "world"]);

Затем представьте функцию в родительском окне:

function someFunction(arg) {
  if (arg instanceof Array) {
    // ... operate on the array
  }
}

Это не сработает. Зачем? Потому что массив, созданный в окне <iframe> был создан из конструктора Array в этой области, и, следовательно, массив не является экземпляром, созданным из Array в родительском окне.

Существует гораздо более прочная "стена" между сферами веб-рабочих и областями окон, и такие эффекты не возникают в этих взаимодействиях.