окно.место против просто места


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

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

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

9 58

9 ответов:

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

  1. это хорошая привычка избегать глобальных переменных, когда это возможно. Используя window. префикс напоминает мне, что переменная является глобальной, а другие нет.
  2. характер области 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>

The

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

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

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

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