window.location проти просто розташування


79

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

Я розумію, що locationце вважається "властивістю" вікна, в якому ви перебуваєте, і, я гадаю, має певний сенс. Але навіть незважаючи на це, я не бачу підстав вказувати глобальний об'єкт; неможливо перезаписати locationспочатку, не перенаправивши сторінку.

Отже, це лише химерність, яка використовується так довго, що вона інтегрується з тим, як ми пишемо JavaScript, або є якась реальна причина робити все таким чином? Я перевірив Google, але, на жаль, я нічого не придумав ...

Відповіді:


85

Я завжди використовую window.locationсвій код з двох основних причин:

  1. Це гарна звичка уникати глобальних змінних, коли це можливо. Використання window.префікса нагадує мені, що змінна є глобальною, а інші - ні.
  2. Характер масштабування Javascript дозволяє замінити змінні, встановлені вище вгору по дереву області. Це означає, що ви могли встановити var locationдесь в області, що містить, (це не навряд чи слово, що використовується як ім'я змінної), і ви б працювали над цим.

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


Я також уявляю, що сказати JS, де знайти змінну, замість того, щоб робити її цикл по ланцюжку сфери до глобальної області, може бути більш швидким підходом.
Rayjax

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

16

Частково для безпеки, якщо хтось визначає locationзмінну десь у ланцюжку обсягу. the 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
    })();

})();

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 має велику історію копіювання та вставки.


Це те, що я зрозумів, але так багато людей робить це; майже кожне джерело, яке я бачу, використовує window.location. Єдині сторінки "проти", які я міг знайти, обговорювали window.locationпроти location.href, що теж не допомогло.
Рейд,

5

Це не завжди питання стилю - я намагався асинхронно завантажувати кнопки соціальних мереж після події завантаження вікна, додаючи елементи сценарію до фрагмента, а потім додаючи цей фрагмент до документа. Віджети Twitter Twitter використовують 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>

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.


1

location - це властивість віконного об'єкта, тому ви можете отримати його, запитувавши window.location. Але якщо ви не вказали об'єкт, JavaScript передбачає, що ви хочете об'єкт вікна. Отже, просто запит на розташування - це те саме, що запит на window.location.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.