JavaScript. Подробное руководство, 6-е издание, стр. 197
14.8.3. JavaScript во взаимодействующих окнах
Для каждого окна или фрейма имеется свой собственный объект
<b>Window</b>Представим себе веб-страницу с двумя элементами
<b><iframe></b><b>var і = 3;</b>Это переменная представляет собой свойство глобального объекта, т. е. свойство объекта
<b>Window</b><b>window</b><b>window.і</b>Благодаря тому что сценарий во фрейме В может ссылаться на объект
<b>Window</b><b>parent.А.і = 4; // Изменит значение переменной во фрейме А</b>Напомню, что ключевое слово
<b>function</b><b>var</b><b>f</b><b>f</b><b>f()</b><b>f</b><b>Window</b><b> parent.В.f();</b>Если сценарий во фрейме А часто вызывает эту функцию, ее можно присвоить переменной во фрейме А, чтобы было удобнее ссылаться на функцию:
<b>var f = parent.В.f;</b>Теперь сценарий во фрейме А сможет вызывать функцию как
<b>f()</b>Разделяя подобным образом функции между фреймами или окнами, очень важно помнить о правилах лексического контекста. Функции выполняются в том контексте, в котором они определены, а не в том, из которого они вызываются. Следовательно, если функция
<b>f</b>Напомню, что конструкторы - это тоже функции, поэтому когда вы определяете класс объектов (см. главу 9) с функцией-конструктором и связанным с ним объектом-прототипом, этот класс будет определен только для одного окна. Предположим, что окно, содержащее фреймы А и В, включает класс
<b>Set</b>Сценарии в окне верхнего уровня смогут создавать новые объекты
<b>Set</b><b>var s = new Set();</b>Но сценарии в обоих фреймах должны явно ссылаться на конструктор
<b>Set()</b><b>var s = new parent.Set();</b>В качестве альтернативы сценарий в любом фрейме может определить собственные переменные для более удобного обращения к функции-конструктору:
<b>var Set = top.Set(); </b><b>var s = new Set();</b>В отличие от пользовательских классов, предопределенные классы, такие как
<b>Set</b><b>Date</b><b>RegExp</b><b>String()</b><b>String.prototype</b><b>String</b><b>String.prototype</b>Тот факт, что каждый объект
<b>Window</b><b>instanceof</b><b>instanceof</b><b>false</b><b>String()</b>Мы неоднократно отмечали, что в клиентском JavaScript объект Window является глобальным объектом. Однако если смотреть с технической точки зрения, это не так. Каждый раз, когда веб-броузер загружает содержимое в окно или фрейм, он должен создать новый контекст выполнения JavaScript, включая и новый глобальный объект. Но при наличии нескольких взаимодействующих окон или фреймов очень важно обеспечить сохранность ссылки на объект
<b>Window</b>Таким образом, в клиентском JavaScript имеется два объекта, играющих важную роль. Первый - это клиентский глобальный объект, который находится на вершине цепочки областей видимости и в котором определяются глобальные переменные и функции. Этот глобальный объект действительно замещается новым объектом, когда в окно или фрейм загружается новый документ. Второй объект, который мы называем объектом
<b>Window</b><b>Window</b><b>WindowProxy</b><b>Window</b>