window.location против просто местоположения - PullRequest
65 голосов
/ 17 января 2011

В Интернете я вижу огромное количество программистов на JavaScript, которые пишут window.location вместо location.Мне было любопытно, если кто-нибудь мог бы объяснить, почему.window является глобальным объектом, и поэтому нет необходимости включать - не так ли?Я имею в виду, вы не видите, что люди пишут window.Math.floor или new window.Date(), поэтому мне любопытно, почему это будет указано с помощью location.

Я понимаю, что location считаетсябыть "свойством" окна, в котором вы находитесь, что, я думаю, имеет некоторый смысл.Но даже в этом случае я не вижу смысла указывать глобальный объект;во-первых, невозможно перезаписать location, не без перенаправления страницы.

Итак, это просто причуды, которые использовались так долго, что стали интегрированы с тем, как мы пишем JavaScript, илиЕсть ли какая-то осязаемая причина, чтобы так поступать?Я проверил гугл, но увы ничего не придумал ...

Ответы [ 9 ]

67 голосов
/ 17 января 2011

Я всегда использую window.location в своем коде по двум основным причинам:

  1. Это хорошая привычка избегать глобальных переменных, когда это возможно. Использование префикса window. напоминает мне, что переменная является глобальной, а другие - нет.
  2. Природа области видимости Javascript позволяет вам переопределять переменные, установленные выше, в дереве областей. Это означает, что вы могли бы установить var location где-нибудь в содержащей области (это не маловероятно, чтобы слово использовалось в качестве имени переменной), и вы бы вместо этого работали над этим.

Для меня ясность цели при кодировании очень важна, поскольку она помогает мне избежать написания ошибок, а затем помогает мне находить их, когда я это делаю.

14 голосов
/ 17 января 2011

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

Пример: http://jsfiddle.net/dr6KH/

(function() {
    var location = 'new value'; // creating a local variable called "location"

    (function() {
        alert(location);  // alerts "new value"

        alert(window.location);  // alerts the toString value of window.location
    })();

})();
9 голосов
/ 17 января 2011

Существует большая разница между window.location и нативными объектами Math и Date, заключающимися в том, что Math и Date являются нативными объектами JavaScript, которые определены в качестве свойств глобального объекта, в то время как window.location является свойством window хост-объекта (хост-объект - это объект, представляющий некоторый аспект среды, предоставляемый средой, и на него не распространяются те же правила, что и для собственных объектов JavaScript Другие хост-объекты включают document и любой элемент DOM).

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

Одной из веских причин не ставить префикс Date или Math с window. является то, что при этом создается код, который не работает в среде без браузера. Другие среды обычно не предоставляют window в качестве псевдонима для глобального объекта.

6 голосов
/ 17 января 2011

Часть кодирования - ясность.В отличие от Math или Date, location концептуально является свойством окна, поэтому код становится более понятным, чтобы включить его.Окно."в идеале префикс должен быть удален для минимизации.

Вы, вероятно, правы, что большая часть причин историческаяJavascript имеет обширную историю копирования и вставки.

5 голосов
/ 18 декабря 2012

Это не всегда просто вопрос стиля - я пытался асинхронно загружать кнопки социальных сетей после события загрузки окна, добавляя элементы скрипта к фрагменту, а затем добавляя этот фрагмент в документ. Widgets.js в Twitter использует location.href в нескольких местах и ​​вызывал следующую ошибку в IE 8/9: Неожиданный вызов метода или доступа к свойству . Я не понял, почему, но это происходит только при посещении страницы по ссылке с другой страницы. Если вы просто добавляете элемент script к заголовку или используете window.location.href, этого не происходит, поэтому это кажется странным с IE 8/9 и createDocumentFragment().

Пример:

<a href="http://twitter.com/share" class="twitter-share-button" data-url="http://www.stackoverflow.com">Tweet</a>
<script>
(function (d, t) {
    var head = document.getElementsByTagName('head')[0];
    var frag = d.createDocumentFragment();
    var s = d.createElement(t);
    s.async = true;
    s.src = 'http://platform.twitter.com/widgets.js';
    frag.appendChild(s);
    head.appendChild(frag);
} (document, 'script'));
</script>
3 голосов
/ 17 января 2011

Объект window является рабочим пространством имен по умолчанию, поэтому location будет равен window.location.

Я думаю, что использование location немного двусмысленно, для ясности используйте window.location.

2 голосов
/ 17 января 2011

Это просто вопрос стиля.

Концептуально, location является свойством window (окно находится в определенном месте), в отличие от Math или Date.

1 голос
/ 17 января 2011

location является свойством объекта окна, поэтому вы можете получить его, запросив window.location. Но если вы не укажете объект, JavaScript предполагает, что вам нужен объект окна. Так что просто запросить местоположение - это то же самое, что запросить window.location.

0 голосов
/ 17 января 2011

Они на самом деле идентичны.Технически, объект "window" - это то же самое, что корневая область видимости для переменных Javascript.

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