Ответ 1
как глобальный объект связан с функцией?
и можно ли его изменить?
Нет. Вам нужно будет создать новую функцию в контексте другого окна (например, используя конструктор eval
или Function
).
Скажем, там есть функция в верхнем окне. Например:
function z() { alert(window.name); }
Давайте также скажем там iframe в этом документе (то же самое происхождение).
Может ли функция в верхнем окне выполнять эту функцию в контексте другого окна, так что она отображает имя iframe, а не верхнего окна?
Другими словами, как глобальный объект связан с функцией и может ли быть изменен?
Наивная попытка, которая не работает: https://jsfiddle.net/wos2o3gx/ (отображает верхнюю часть для обоих вызовов).
как глобальный объект связан с функцией?
и можно ли его изменить?
Нет. Вам нужно будет создать новую функцию в контексте другого окна (например, используя конструктор eval
или Function
).
Как глобальный объект привязан к функции и может ли быть изменен?
Глобальный контекст функции определяется во время создания функции и не изменяется даже тогда, когда вы делаете эту функцию свойством другого контекста window
. Существуют динамические альтернативы, такие как замена window
на this
, но поскольку this
не всегда задается глобальным объектом (например, в строгом режиме), я бы предложил передать переменную window
в вашу функцию вместо:
function z (window) {
window = window || self
console.log(window.name)
}
window.name = 'w top'
z()
var iframe = document.getElementById('iframe')
iframe.contentWindow.name = 'w iframe'
z(iframe.contentWindow)
<iframe id="iframe" src="about:blank" name="w iframe">
</iframe>
вы можете использовать this
вместо window
в вашем примере, например:
function z() {
alert(this.name);
}
window.name = 'w top';
z();
var iframe = document.getElementById('iframe');
frame.contentWindow.name = 'w iframe';
frame.contentWindow.z = z;
frame.contentWindow.z();