JavaScript中的this.window不等于window。

5
考虑以下顶级JavaScript代码:

请注意以下JavaScript代码:

if (this.window === window)
    alert('same');
else
    alert('different'); // alerts: different  

为什么 this.window 和 window 不是严格相等的?我也尝试在表达式的 rhs 上使用 'this',结果相同。

在Chrome中,this.window === window返回true - Jeremy
你使用的是哪个浏览器?无论是Firefox还是Chrome,都会返回true,因为它们都支持this.window === window。或者你有任何关于Iframes的情况吗? - Aidas Bendoraitis
1
如果你真的得到了 this !== window,我相信你一定是在非顶层运行代码。如果 this === window,那么就有 this.window === window,因为 window.window === window - Chris Morgan
1
Aidas和Dylan是正确的,这似乎是IE8的特殊性。 (this === window返回true,this.window === window返回false) - Seth Stone
在IE8中,(window.window === window.window.window)返回什么? - code_monk
4个回答

8

在Internet Explorer(我测试的是8.0.7600版本),没有限定符的this实际上解析为全局窗口对象。在我尝试过的所有其他浏览器中(Chrome,Firefox,Opera),在那个上下文中this.window === window - 并且,有用的是,this === window也是一样的。

在IE中尝试验证:

if (this === window)
  alert('same');
else
  alert('different');

1
在你提供的例子中,'same' 在IE8中被弹出。我认为你最精确地回答了我的原始问题...这实际上是IE8的一个特殊情况。 - Seth Stone
1
IE8对此的处理方式更有意义。this.window似乎等同于window.window - Bryan Downing

3
似乎HTML元素不包含指向其父窗口的指针,就像对于parentNode一样。因此,当this是除window对象之外的任何内容时,this.window将返回undefined。
window对象似乎能够引用自身,可能是因为它是唯一高度足够“看到”自身的节点。因此,window == window.window.window.window等等。
浏览器之间的特殊性似乎与每个浏览器如何实现DOM结构以及特别是如何在顶层解释this有关。
考虑到单独的HTML元素无法使用.window引用其父窗口,我真的不认为有任何使用this.window的意义,尽管我很乐意在这里被证明是错误的。
如果您正在处理涉及在两个不同窗口之间操作对象的代码,我建议将新窗口分配给变量,例如var newWin = window.open(...),然后使用此变量引用新对象。

原生JavaScript代码的额外位:在当前作用域中提供了this === windowfunction t(){return this};t() === window(x = new t()) === x(不是window)。 - Chris Morgan
我认为处理顶层的this是严格定义的;我知道至少Processing.js使用this而不是window,显然是因为它更短(当我看到它时感到惊讶,所以我问了)。在全局范围内,this === window应该始终为真。 - Chris Morgan
1
@Chris:如果你想访问全局对象,那么在非浏览器环境下运行代码时,应该使用this而不是window。虽然在大多数情况下它们可以被认为是相同的,但window和全局对象并不完全相同,特别是在浏览器之外的环境中。 - Tim Down
@Tim:我想这是有道理的;然而,Processing.js仅针对浏览器(由于其性质,使用<canvas>等)。 - Chris Morgan
@Jeff - 我想点赞这个,但我还没有足够的信用。 :-( - Seth Stone

2

他说这是“顶级JavaScript代码”,所以你的第一个答案是正确的,而你说自己错了是错误的。它确实可以工作并且是正确的。 - Chris Morgan

0

因为在全局上下文中,this 等于 window


因此,this.window === window,因为window是全局变量 - window.window === windowwindow.window.window === window ;-) - Chris Morgan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接