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

Log*_*nch 2 javascript nested window object

例如,您可以使用window对象来调用alert函数:

window.alert("Hello World!");
Run Code Online (Sandbox Code Playgroud)

您还可以在window对象中使用该window对象:

window.window.alert("Hello World!");
Run Code Online (Sandbox Code Playgroud)

哎呀,你甚至可以这样做:

window.window.window.window.window.window.window.window.window.window.window.window.window.alert("Hello World!");
Run Code Online (Sandbox Code Playgroud)

我知道这很荒谬,没有理智的开发人员会在现实生活中这样做,但是为什么这可能呢?

为什么会有这么多嵌套window对象?

Fel*_*ing 5

每个全局变量都是全局对象的属性。window是全球性的,因此window.window必须存在并引用自身:

console.log(window.window === window)
Run Code Online (Sandbox Code Playgroud)

但是为什么会这样呢?

这只是一个循环引用。该属性的值是对象本身。简单的例子:

var foo = {
  bar: 42
};
foo.foo = foo;
console.log(foo.bar);
console.log(foo.foo.bar);
console.log(foo.foo.foo.bar);
Run Code Online (Sandbox Code Playgroud)

您在DOM中也有循环引用:

var body = document.body;
console.log(body.parentNode.children[1] === body);
Run Code Online (Sandbox Code Playgroud)