окно.место против просто места
в Интернете, я вижу огромное количество JavaScript-программисты пишут просто location
. Мне было любопытно, может ли кто-нибудь объяснить, почему. window
это глобальный объект, и поэтому нет необходимости включать -- не так ли? Я имею в виду, вы не видите, как люди пишут window.Math.floor
или new window.Date()
, поэтому мне любопытно, почему это будет указано с location
.
Я понимаю, что location
считается "свойством" окна, в котором вы находитесь, которое я предположим, имеет какой-то смысл. Но даже в этом случае я не вижу причин указывать глобальный объект; невозможно перезаписать location
во-первых, не без перенаправления страницы.
Итак, это просто причуда, которая использовалась так долго, что она стала интегрирована с тем, как мы пишем JavaScript, или есть какая-то ощутимая причина делать это таким образом? Я проверил Google, но увы, ничего не придумал...
9 ответов:
Я всегда использую
window.location
в моем коде по двум основным причинам:
- это хорошая привычка избегать глобальных переменных, когда это возможно. Используя
window.
префикс напоминает мне, что переменная является глобальной, а другие нет.- характер области Javascript позволяет переопределять переменные, установленные выше в дереве областей. Это означает, что вы могли бы установить
var location
где-то в области (не маловероятное слово, чтобы использовать в качестве имени переменной) и ты будешь работать на нем.для меня ясность цели при кодировании очень важна, поскольку это помогает мне избежать написания ошибок, а затем помогает мне найти их, когда я это делаю.
частично для безопасности, в случае если кто-то определяет
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 })(); })();
есть большая разница между
window.location
и роднойMath
иDate
объектов, который заключается в том, чтоMath
иDate
являются собственными объектами JavaScript, которые указаны как свойства глобального объекта, в то время какwindow.location
является собственностьюwindow
хост-объекта (объект хоста-это объект, представляющий некоторый аспект среды, предоставляемый средой, и не подчиняется тем же правилам, что и собственные объекты JavaScript. Другие объекты хоста включитьdocument
и любой элемент DOM).
window
в браузерах служит двум целям: во-первых, выступая в качестве (хорошо определенного) глобального объекта ECMAScript, а во-вторых, выступая в качестве объекта хоста, предоставляющего информацию о среде браузера. Для использованияwindow
в своей емкости объекта хоста я предпочитаю быть явным и предоставлятьwindow.
префикс: дело в том, чтоlocation
работает без него это просто совпадение, которое исходит отwindow
шизофреническая натура. Кроме того, как указывает другие ответы, это также имеет преимущество защиты в том случае, когда другойlocation
переменная существует в текущем контексте.одна веская причина для не приставки
Date
илиMath
Сwindow.
это делает так создает код, который не работает в среде без браузера. Других средах, как правило, не обеспечиваютwindow
как псевдоним для глобального объекта.
частью кодирования является ясность. В отличие от Math или Date, location концептуально является свойством окна, поэтому код становится более понятным для его включения. Окно."префикс в идеале должен быть удален для минимизации.
вы, вероятно, правы, что многие причины являются историческими. JavaScript имеет обширную историю копирования и вставки.
это не всегда просто вопрос стиля - я пытался загрузить кнопки социальных сетей асинхронно после события загрузки окна, добавив элементы сценария к фрагменту, а затем добавив этот фрагмент в документ. Виджеты Твиттера.js использует
location.href
в нескольких местах и вызывал следующую ошибку в IE 8/9:неожиданный вызов метода или свойства Access. Я не понял, почему, но это происходит только при посещении странице по ссылке с другой страницы. Если вы просто добавляете элемент скрипта в голову или используете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>
location-это свойство объекта window, поэтому вы можете получить его, запросив окно.местоположение. Но если вы не укажете объект, JavaScript предполагает, что вам нужен объект window. Поэтому просто запрашивать местоположение-это то же самое, что запрашивать окно.местоположение.
Это просто вопрос стиля.
концептуально,
location
является собственностьюwindow
(Окно находится в определенном месте), в отличие отMath
илиDate
.
они фактически идентичны. Технически,"
window
" объект-это то же самое, что и корневая область для переменных Javascript.