Нужно ли писать window.X при обращении к встроенному глобальному свойству X в (настольном) браузере? - PullRequest
8 голосов
/ 28 марта 2011

Итак, в браузере (десктоп) есть десятки встроенных глобальных свойств. Например:

  • document
  • undefined
  • parseInt
  • JSON
  • location
  • alert
  • setTimout
  • и т.д.

При обращении к этим свойствам следует ли явно указывать их как глобальные свойства, добавляя к их имени префикс window.? Так, например:

var wrap = window.document.getElementById('wrap');

и

window.setTimeout(loop, 100);

и

var x = window.parseInt(input.value, 10);

Я думаю, что есть три ответа на этот вопрос:

  1. Да, при обращении к глобальным свойствам всегда следует писать window.X.

  2. Нет, вам не нужно писать window.X. Просто X нормально.

  3. Это зависит от имущества. Для некоторых свойств используйте window.X, для некоторых других свойств используйте X. (Если это ваш ответ, уточните.)

Итак, что это?

Ответы [ 5 ]

8 голосов
/ 28 марта 2011

Я бы пошел на 3: нет window за исключением нескольких исключений.

В браузерах window относится к глобальной области видимости. window. как в window.prompt() является избыточным. Вы можете использовать его, чтобы подчеркнуть, что prompt() - это метод объекта window.

Я бы никогда не использовал что-то вроде window.Math или window.NaN, потому что эти свойства являются глобальными объектами, которые не имеют ничего общего с объектом window, который случайно является глобальным объектом в браузерах. См. Также Глобальные свойства и функции, определенные в ECMAScript .

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

(function() {
   var prompt = "Give me your name!";
   var name = window.prompt(prompt, "your name");
})();

Для установки глобальных переменных вы также должны добавить префикс window., чтобы удовлетворить такие инструменты, как jslint . (в противном случае это выглядело бы так, будто вы забыли ключевое слово var и, таким образом, случайно пропустили переменную в глобальной области видимости):

(function() {
   // "WRONG"
   somevar = 1;
   // You probably want to set a local variable, so should use:
   var somevar = 1;
   // take away the confusion, you really wanted to set a global variable:
   window.somevar = 1;
})();

Как правило, пропуск window. улучшает читабельность, учитывая следующий пример:

window.setInterval(function() {
   var numA = window.parseInt(window.document.getElementById("numA").value, 10);
   var numB = window.parseInt(window.document.getElementById("numB").value, 10);
   window.document.getElementById("avg").value = window.Math.floor((numA + numB) / 2);
}, 1000);
2 голосов
/ 28 марта 2011

Обычно, если я не сомневаюсь, что люди перезаписывают известные глобальные переменные локальными именами, я использую X напрямую вместо того, чтобы ссылаться на него как window.X.

Однако для Setter ситуаций, а не Getter ситуаций, я хотел бы использовать window.X, чтобы проиллюстрировать, что я поднимаю конкретную переменную в глобальную область.

В идеале мне бы хотелось, чтобы все управлялось событиями и обратными вызовами и ограничивало переменные установки в глобальной области видимости.

(function($, undefined) {
    ...
    var SomeUsefulConstruct = function() { 
         ...
    }
    ...
    // hoist to global scope
    window.SomeUsefulConstruct = SomeUsefulConstruct;
    ...
}(jQuery);

Придерживаясь этой схемы использования window.X, вы можете сделать это очень ясно, когда вы устанавливаете данные на глобальном уровне. В идеальных ситуациях вы можете вообще не использовать глобальные переменные, кроме как с использованием набора обратных вызовов и обработчиков событий.

0 голосов
/ 28 марта 2011

Есть один хитрый случай - атрибут window.name. Например, с кодом

name = "myWindow";

свойство window.name изменяется в IE и Chrome, поэтому <a target=myWindow> открывается в том же окне в этих браузерах, и в новом окне в Firefox и Opera. В этом случае всегда используйте обозначение window.name для кросс-браузерной функциональности.

Лучше всего использовать window.X только тогда, когда X действительно является свойством window. Не используйте window.Infinity, потому что нет 'Infinity' in Window.prototype.

0 голосов
/ 28 марта 2011

ответ равен 2, пока вы не будете уверены, что в вашей текущей области действия setTimeout функция (например) не была переопределена «локальной» функцией.более того, в некоторых средах объект window может отсутствовать (или может быть чем-то еще).

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

(function(global){
    // ... your code
})(this);
0 голосов
/ 28 марта 2011

Лично я возьму (3) , хотя я думаю, что (2) тоже хороший ответ.Моя причина в том, что некоторые объекты на самом деле не являются частью глобальной среды, которая оказывается окном браузера.Просто кажется странным писать window.Math.floor(n), потому что в спецификации присутствует "Math" как стандартная встроенная вещь.Однако «top» или «document» свойственны определенному виду глобального контекста, поэтому представляется более целесообразным использовать спецификатор «window».

(Моя собственная практика где-то посередине; я склонениспользовать «окно» явно для вещей, о которых я просто привык думать, но в большинстве случаев оно рушится, как я уже писал выше.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...