在不同窗口的上下文中执行一个函数?

时间:2017-03-26 10:31:53

标签: javascript dom

假设顶部窗口中有一个功能。例如:

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

我们还要说这个文档中有一个iframe(同源)。

顶部窗口中的函数是否可以在另一个窗口的上下文中执行此函数,以便显示iframe的名称而不是顶部窗口?

换句话说,全局对象如何绑定到一个函数并且可以更改?

无效的天真尝试:https://jsfiddle.net/wos2o3gx/(显示两个调用的顶部)。

3 个答案:

答案 0 :(得分:10)

  

全局对象如何绑定到函数并且可以更改?

函数的全局上下文在创建函数时确定,即使您将该函数作为另一个window上下文的属性,也不会更改。有动态替代方案,例如用window替换this,但由于this并不总是设置为全局对象(例如在严格模式下),我建议传递{{ 1}}变量到你的函数:

<小时/>

Demo Snippet(JSFiddle):

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)

答案 1 :(得分:4)

您可以在示例中使用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();

答案 2 :(得分:4)

  

全局对象如何绑定到函数?

closure

  

可以改变吗?

没有。您需要在其他窗口的上下文中创建一个新函数(例如,使用其evalFunction构造函数)。