2015-10-23 5 views
6

При добавлении некоторого кода инициализации на веб-страницу, я обнаружил, что пишу window.onload = ... в течение девяностого времени, когда мысль ударила меня.Почему мы пишем окно.?

window. не требуется, потому что window - текущий объект. Так что это необязательно!
Но никто не пишет только onload = ..., и я удивляюсь, почему это так.

Я имею в виду, что у нас нет проблем с написанием других вещей, скажем alert без квалификатора window..

window.onload = function() { 
    alert('Your window has loaded'); 
}; 

в то время как в действительности, alert просто такой же метод window объекта как onload есть.
Итак, почему разница? Почему даже официальные сайты, такие как W3C, делают это?

+14

Это * явный *, поэтому никто не думает, что вы просто случайно назначаете глобальную переменную. – Bergi

+0

Мне нравится этот аргумент, так как он объясняет разницу. Присвоение чего-то переменной или вызову функции - вы не могли бы создать новую функцию, просто называя ее, поэтому ясно, что функция уже существует где-то. –

+0

@Bergi Можете ли вы разместить это как ответ? Я думаю, что это все еще самый веский аргумент. –

ответ

0

Мы пишем window., когда хотим быть откровенными. Есть два основных случая, когда это хорошая форма, чтобы использовать его:

  • свойства и методы window объекта - все, что является частью Window interface. Вы можете упомянуть об этом слушателе .onload, например, window.scrollY, window.status, window.parent, window.open(), window.focus(), window.removeEventListener().
  • создание глобальных объектов. Присвоение window.myGlobalVar из любой области действия - это общая JS-идиома для создания глобальной «переменной». По общему признанию, по-прежнему лучше заявить об этом с var.

Хотя мы могли «опционально» опустить здесь window., это необычно. Особенно создание implicitly global variables через назначение презирают и обычно воспринимаются как ошибка. Поэтому, если вы делаете это специально, вы заявляете о своем намерении, используя window..

Однако первый случай не всегда четко определен. Мы часто опускаем часть window., когда свойство, которое мы хотим использовать, по существу является статической глобальной переменной и не обязательно связано с объектом window, даже если оно официально определено на нем. Вы редко видите кого с помощью document, atob(), Worker, setTimeout() или fetch() с префиксом window., так же, как вы не используете window.JSON.parse или window.Array для встроенных объектов (хотя это было бы справедливо).

Для некоторых других свойств, таких как navigator, location или alert() это не всегда ясно, и те, которые используются, возможно, пятьдесят на пятьдесят без или нет.

5

Я вижу следующие причины:

  1. Сокращение поиска вверх области видимости цепи улучшит производительность слегка. Это также видно в IIFE, где window отправляется как параметр функции, и внутри него используется локальная ссылка на окно.
  2. Если функция/член, определенная на window глобально, переопределена в области, то она не будет работать должным образом, поэтому ссылка явно указывает на правильную функцию/член. Это полезно для создания функции/члена с тем же именем, что и глобальный, и по-прежнему доступ к глобальному члену из скрытой области.
+1

Хорошо, но почему разница? Почему не все пишут 'window.alert' вместо' alert', что также улучшит производительность? –

+0

@MrLister check 'function onload() { // Код здесь } 0loader_load_1.gif onload = something;', здесь 'onload' не будет работать должным образом. И, как объяснил Андре в ответе, 'onload' не ограничивается только' window', его можно применять к 'img',' iframe' и т. Д., Поэтому он явно добавляется в окно. В случае 'alert' это не функция _critical_, даже если она перезаписана, она не наносит вреда коду (в отличие от' onload'). – Tushar

2

Потому что .onload не является исключением для window. Его также можно использовать, например, как document.onload. Таким образом, вы определяете его в зависимости от того, когда вы хотите, чтобы ваш скрипт выполнялся.

+0

Хорошо, но почему разница? Почему не каждый пишет 'window.alert' вместо' alert', что также не является эксклюзивным? –

-1

Объект окна по умолчанию инициализирован браузером. Его хорошая практика , чтобы определить явно объект окна, он влияет на производительность &, ваш код станет понятным.

Смежные вопросы