Подтвердить что ты не робот

Выполнить функцию в контексте другого окна?

Скажем, там есть функция в верхнем окне. Например:

function z() { alert(window.name); }

Давайте также скажем там iframe в этом документе (то же самое происхождение).

Может ли функция в верхнем окне выполнять эту функцию в контексте другого окна, так что она отображает имя iframe, а не верхнего окна?

Другими словами, как глобальный объект связан с функцией и может ли быть изменен?

Наивная попытка, которая не работает: https://jsfiddle.net/wos2o3gx/ (отображает верхнюю часть для обоих вызовов).

4b9b3361

Ответ 1

как глобальный объект связан с функцией?

закрыть.

и можно ли его изменить?

Нет. Вам нужно будет создать новую функцию в контексте другого окна (например, используя конструктор eval или Function).

Ответ 2

Как глобальный объект привязан к функции и может ли быть изменен?

Глобальный контекст функции определяется во время создания функции и не изменяется даже тогда, когда вы делаете эту функцию свойством другого контекста window. Существуют динамические альтернативы, такие как замена window на this, но поскольку this не всегда задается глобальным объектом (например, в строгом режиме), я бы предложил передать переменную window в вашу функцию вместо:


Демо-фрагмент (JSFiddle):

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>

Ответ 3

вы можете использовать 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();