我正在玩窗户物体寻找东西。我注意到,全局窗口对象被复制到多个级别。
尝试:
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
我们有什么办法可以利用这个吗?
答案 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仍然可以设置为当前窗口对象。)
答案 3 :(得分:1)