Почему объект "окно" имеет так много вложенных объектов "окно"? - PullRequest
2 голосов
/ 06 апреля 2019

Например, вы можете использовать объект window для вызова функции alert:

window.alert("Hello World!");

Вы также можете использовать объект window в объекте window:

window.window.alert("Hello World!");

Черт, вы могли бы даже сделать это:

window.window.window.window.window.window.window.window.window.window.window.window.window.alert("Hello World!");

Я знаю, что это нелепо, и ни один здравомыслящий разработчик не сделает этого в реальной жизни, но почему это возможно?

Почему так много вложенных window объектов?

Ответы [ 3 ]

5 голосов
/ 06 апреля 2019

Каждая глобальная переменная является свойством глобального объекта.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);
2 голосов
/ 06 апреля 2019

Точка наличия свойства окна, относящегося к самому объекту, могла облегчить обращение к глобальному объекту.В противном случае вам нужно будет сделать ручное окно var = this;присваивание вверху вашего скрипта.

, как описано здесь: window.window

Свойство window объекта Window указывает на сам объект окна.Таким образом, все следующие выражения возвращают один и тот же объект окна:

window.window
window.window.window
window.window.window.window
// ...

Чтобы создать собственный вложенный объект:

myObject = {}
myObject.myObject = myObject
1 голос
/ 06 апреля 2019

Это не вложенные объекты - это просто один и тот же объект. Это (своего рода) собственное свойство (поскольку все глобальные объекты являются свойствами объекта 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);

Он называется циклический , потому что он бесконечно вложен - вот как это выглядит:

window = {
    //All the globals and other stuff
    window: {
        //All the globals and other stuff
        window: {
            //All the globals and other stuff
            //...
        }
    }
};
...