例如,您可以使用window
对象来调用alert
函数:
window.alert("Wello Horld!");
您还可以在window
对象中使用window
对象:
window.window.alert("Wello Horld!");
哎呀,你甚至可以这样做:
window.window.window.window.window.window.window.window.window.window.window.window.window.alert("Wello Horld!");
我知道这是非常不切实际的,没有理智的开发人员会这样做,但是为什么这可能呢?
为什么有这么多嵌套的window
对象可用?
答案 0 :(得分:3)
每个全局变量都是全局对象的属性。 window
是全局的,因此window.window
必须存在并引用自身:
console.log(window.window === window)
但是为什么这可能呢?
这只是一个循环引用。该属性的值是对象本身。简单的例子:
var foo = {
bar: 42
};
foo.foo = foo;
console.log(foo.bar);
console.log(foo.foo.bar);
console.log(foo.foo.foo.bar);
您在DOM中也有循环引用:
var body = document.body;
console.log(body.parentNode.children[1] === body);
答案 1 :(得分:1)
它们不是嵌套的对象-它们只是完全相同的对象。它(本身)是一个属性(因为所有全局对象都是window
对象的属性,而window
是全局...):
var myGlobal = "Hello!";
console.log(window.myGlobal == window.window.myGlobal);
console.log(window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.window.myGlobal == myGlobal);
它被称为 cyclic ,因为它是无限嵌套的-本质上是它的外观:
window = {
//All the globals and other stuff
window: {
//All the globals and other stuff
window: {
//All the globals and other stuff
//...
}
}
};
答案 2 :(得分:1)
让window属性指向对象本身的观点, 可能使引用全局对象变得容易。除此以外, 您必须手动创建一个var窗口= this;作业位于 您的脚本。
如此处所述:window.window
Window对象的window属性指向该窗口对象本身。因此,以下表达式都返回相同的窗口对象:
window.window
window.window.window
window.window.window.window
// ...
要创建自己的嵌套对象,请执行以下操作:
myObject = {}
myObject.myObject = myObject