为什么我能在控制台window.window.window.window中执行此操作并返回窗口?

时间:2012-03-21 21:48:32

标签: javascript

为什么我能在控制台window.window.window.window中执行此操作并无限追加.window并返回DOM窗口?

4 个答案:

答案 0 :(得分:5)

因为window对象具有指向自身的window属性。

就像你写的那样:

var foo = {};
foo.foo = foo;
console.log(foo.foo.foo.foo.foo.foo.foo);

为了好玩,window对象还有一个self属性指向自身,(如果你不在框架集中)一个top属性也指向它。因此你可以写:

console.log(window.window.top.self.top.self.window.window.self.top.top.self);

答案 1 :(得分:4)

因为window对象有一个名为window的属性,其中包含对window对象的引用。

它的工作原理与此相同:

var foo = {}; 
foo.foo = foo; 
foo.bar = 1; 
alert(foo.foo.foo.foo.foo.bar);

答案 2 :(得分:2)

window是对全局对象的引用,window变量在全局范围内,因此它本质上是指向自身的指针。

答案 3 :(得分:1)

这是因为窗口对象指向窗口对象本身。

此行为的一些原因包括

  • 可以更容易地引用全局对象(否则你会有 做一个手动var窗口=这个;分配在你的顶部 脚本)。
  • 如果没有此属性,您将无法编写“window.open('http://google.com/')”,您只需使用“open('http:// google。 com /')“而不是
  • 使用此属性的另一个原因是希望提供OOP版本和非OOP版本(尤其是JavaScript模块)的库。

进一步阅读here