2014-11-10 4 views
3

В большом количестве примеров кода я вижу вокруг Интернета, глобальные переменные, такие как innerWidth, onresize, navigator и т.д., записываются как window.innerWidth, window.onresizewindow.navigator, соответственно.Почему мы добавляем глобальные переменные с `window.`?

Почему некоторые из этих глобалов были добавлены с window. и другими, такими как document и console обычно не предваряли?

Edit:

Я знаю, как работает ООП и что я доступ различные свойства window объекта. Я не новичок в JavaScript. Извините, если мой вопрос, возможно, был неясным. Я программировал в JS годами, но никогда не сомневался в этом соглашении, следовательно, мой вопрос.

В сущности, я спрашиваю, почему мы не ставим window.document перед тем, но мы ставим его перед innerWidth. Это просто вопрос ясности? Теоретически, не должен ли я ссылаться на любой из глобалов без префикса window. и не иметь проблем?

+3

Вам необходимо прочитать MDN, это очень легко понять объекты. Окно - это окно вашего браузера, консоль - ваша консоль, а документ - документ страницы. –

+3

@SterlingArcher Я не думаю, что вопрос в том, что представляет каждая переменная. Скорее, почему 'window' иногда используется как пространство имен. –

+1

@JonathanLonowski Да. –

ответ

5

Это печально, но window в вашем браузере относится к одному объекту, который представляет две логически разные понятия:

  • экземпляр Window, объект с четко определенными свойствами, как Window.innerWidth, логически отображается в окне браузера (или а вкладка, сегодня, но это различие скрыто от вашего скрипта)
  • global object, которому все глобальные переменные прикрепленного как свойства

Семантически, это чище не префикс глобальных переменных, не связанных с концепцией Window, с window..

Теперь обратите внимание, что это связано с проблемой, когда вы ссылаетесь на свою глобальную специфическую переменную, такую ​​как myThing: трудно узнать, сознательно ли вы имеете в виду глобальную переменную или объявлен в некоторой промежуточной области (или если вы просто забыли для объявления переменной с var). что приводит к ситуации, когда вы не будете использовать window. только для свойств экземпляра Window, но также и для ваших конкретных глобальных переменных. Конечно, на практике вы избегаете глобальных переменных как можно больше.

Не префикс с window. также имеет то преимущество, когда вы забыли объявление var или в библиотеку, чтобы сделать ваш код не быстрым, но не тонким способом (что лучше, чем неудачный выпуск в трудном для отладки) :

window.undeclaredVariable // no error, just an undefined value 
undeclaredVariable // reference error 

JavaScript, вероятно, было бы лучше с различием между этими двумя понятиями (что-то вроде global или root как в узле).

+0

Так что это просто вопрос конвенции? –

+0

Да, это вопрос смысловой последовательности. –

-1

Думайте об этом как о объектах. Вы пытаетесь получить объект innerWidth объекта window. Document - это то же самое. Вы пытаетесь получить те переменные, которые описывают сам document, а не window в целом. И console - это только то, что консоль, которую вы console.log для отладки. Он также имеет свои свойства.

Они могут быть глобальными переменными, но они все еще принадлежат и описывают конкретный «объект», который вы должны сначала вызвать. Если это имеет смысл.

1

Все глобальные функции и переменные привязаны к активатору объекта, этот объект зависит от среды вашего хоста (браузер, узел и т. Д.), В среде браузера активатор объекта является объектом окна, поэтому каждая глобальная функция может быть доступ с window.console, this.console или просто console, я думаю, что префикс полезен для получения более читаемого кода.

Вы можете получить доступ к глобальным облачным переменным без предварительного окна только innerWidth.