为什么“窗口”对象有这么多嵌套的“窗口”对象?

时间:2019-04-06 06:00:58

标签: javascript object nested window

例如,您可以使用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对象可用?

3 个答案:

答案 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