window.location по сравнению с просто местоположением

79

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

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

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

Рид
источник

Ответы:

85

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

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

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

одинокий день
источник
Я также полагаю, что указание JS, где найти переменную, вместо того, чтобы заставлять ее перебирать цепочку областей видимости до глобальной, может быть более быстрым подходом.
Rayjax
3
@Rayjax Нет, на самом деле, потому что JS также должен пройти через цепочку областей видимости, чтобы определить, что window есть.
lonesomeday
16

Частично для безопасности на случай, если кто-то определит 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
    })();

})();
user113716
источник
11

Существует большая разница между 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

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

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

fuzzyTew
источник
Я так и подумал, но так много людей делают; практически каждый источник, который я вижу, использует window.location. Единственные страницы «против», которые я смог найти, обсуждают window.locationпротив location.href, что тоже не помогло.
Reid
5

Это не всегда просто вопрос стиля - я пытался асинхронно загружать кнопки социальных сетей после события загрузки окна, добавляя элементы скрипта к фрагменту, а затем добавляя этот фрагмент в документ. Twitter widgets.js используется location.hrefв нескольких местах и ​​вызывал следующую ошибку в IE 8/9: Неожиданный вызов метода или доступа к свойству . Я не понял почему, но это происходит только при посещении страницы по ссылке с другой страницы. Если вы просто добавляете элемент скрипта в заголовок или используете 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>
Rhurkes
источник
3

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

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

Яков Релкин
источник
1
Я проголосовал за этот ответ (и почти ни за один другой), потому что представьте себе этот глупый пример: function f() { var location = "home"; /* later on */ location = "http://google.com" } cry
@ user166390 По этой логике вы должны писать window.documentкаждый раз. Я сомневаюсь, что кто-то так делает.
superlukas
2

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

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

SLaks
источник
1

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

Arlomedia
источник
0

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

Адам Баткин
источник