为什么全局“窗口”对象具有多级访问权限

时间:2013-02-21 11:05:08

标签: javascript

我正在玩窗户物体寻找东西。我注意到,全局窗口对象被复制到多个级别。

尝试:

console.log(window); // returns global window object
console.log(window.window); // returns global window object
console.log(window.window.window); // returns global window object
console.log(window.window.window.window); // returns global window object 
console.log(window.window.window.window.window); // returns global window object

console.log(window === window.window); // returns true
console.log(window.window.window === window.window.window.window); // returns true

window.zombie = "Zombie!";

console.log(window.zombie === window.window.zombie); // returns true

我们有什么办法可以利用这个吗?

4 个答案:

答案 0 :(得分:5)

它不是真正的多层次,你只需要一个属性指向自己,然后你就会有递归。

例如:

var zombie = {
    fred: 'Hello'
};

zombie.zombie = zombie;

你现在可以疯狂地做:

alert(zombie.zombie.zombie.zombie.fred);

至于window存在的具体原因,请参阅Kevin Brydons的回答。它对第一级有意义,但其余部分只是自我引用的副产品。

答案 1 :(得分:3)

Mozilla对.window属性

做了简明扼要的解释

https://developer.mozilla.org/en-US/docs/DOM/window.window

摘录:

  

让窗口属性引用对象本身就是这样   (可能)使参考全局对象变得容易(否则   你必须做一个手动var窗口=这个;在顶部的任务   你的剧本)

答案 2 :(得分:2)

  

让窗口属性引用对象本身就是这样   (可能)使参考全局对象变得容易(否则   你必须做一个手动var窗口=这个;在顶部的任务   你的剧本。)

     

另一个原因是没有这个属性你将无法做到   写一下,例如,“window.open('http://google.com/')” - 你有   只需使用“open('http://google.com/')”而不是。

     

使用此属性的另一个原因是希望的库   提供OOP版本和非OOP版本(尤其是JavaScript   模块)。例如,如果我们引用“this.window.location.href”,a   JavaScript模块可以定义一个名为“window”的属性   它定义的类(因为没有全局“窗口”变量存在   默认情况下,可以创建,例如,在传入a之后   window对象到模块类的构造函数。因此,“this.window”   其函数内部将引用该窗口对象。在里面   非命名空间版本,“this.window”将简单地引用回来   “窗口”,也可以在没有的情况下获取文档位置   麻烦。另一个优点是这类课程的对象(甚至   如果在模块之外定义了类,可以改变它们   随意引用窗口,因为他们无法做到   他们对“窗口”的引用进行了硬编码(但默认情况下是“窗口”)   class仍然可以设置为当前窗口对象。)

source

答案 3 :(得分:1)

来自the MDN

  

window.window:返回对当前窗口的引用。

这个简单的引用使对象循环。