window.location a tylko lokalizacja


79

W Internecie widzę ogromną liczbę programistów JavaScript, którzy piszą window.locationzamiast tylko location. Byłem ciekawy, czy ktoś mógłby wyjaśnić, dlaczego. windowjest obiektem globalnym i dlatego nie trzeba go uwzględniać - prawda? Chodzi mi o to, że nie widzisz, jak ludzie piszą window.Math.floorlub new window.Date(), więc jestem ciekawy, dlaczego zostałoby to określone za pomocą location.

Rozumiem, że locationjest to uważane za „właściwość” okna, w którym się znajdujesz, co, jak sądzę, ma jakiś sens. Ale mimo to nie widzę powodu, aby określać obiekt globalny; nie ma możliwości nadpisania locationw pierwszej kolejności, nie bez przekierowania strony.

Czy to tylko dziwactwo, które było używane od tak dawna, że ​​zostało zintegrowane ze sposobem, w jaki piszemy JavaScript, czy też istnieje jakiś namacalny powód, aby robić to w ten sposób? Sprawdziłem Google, ale niestety nic nie wymyśliłem ...

Odpowiedzi:


85

Zawsze używam window.locationw moim kodzie z dwóch głównych powodów:

  1. Jeśli to możliwe, dobrze jest unikać zmiennych globalnych. Użycie window.przedrostka przypomina mi, że zmienna jest globalna, a inne nie.
  2. Charakter zakresu JavaScript pozwala na przesłonięcie zmiennych ustawionych wyżej w drzewie zasięgu. Oznacza to, że mogłeś ustawić var locationgdzieś w zakresie zawierającym (nie jest to nieprawdopodobne słowo, aby użyć go jako nazwy zmiennej) i zamiast tego pracowałbyś nad tym.

Dla mnie jasność celu podczas kodowania jest bardzo ważna, ponieważ pomaga mi uniknąć pisania błędów, a następnie pomaga mi je znaleźć, gdy to zrobię.


Wyobrażam sobie również, że wskazanie JSowi, gdzie znaleźć zmienną, zamiast tworzenia pętli w łańcuchu zasięgu do zasięgu globalnego, może być szybszym podejściem.
Rayjax

3
@Rayjax Nie, właściwie, ponieważ JS musi również zapętlić łańcuch zasięgu, aby określić, co window jest.
lonesomeday

16

Częściowo ze względów bezpieczeństwa na wypadek, gdyby ktoś zdefiniował locationzmienną gdzieś w łańcuchu zasięgu. window.locationsprawia, że jest to wyraźne odniesienie do własności window.

Przykład: 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

Jest duża różnica między window.locationi rodzimy Mathi Dateobiektów, które jest to, że Mathi Daterodzimych obiektów JavaScript, które są określone istnieć jako właściwości obiektu globalnego, natomiast window.locationjest własnością window obiektu hosta (głównym obiektem jest obiekt reprezentujący pewne aspekty środowisko dostarczane przez środowisko i nie podlega tym samym regułom co natywne obiekty JavaScript. Inne obiekty hosta obejmują documentdowolny element DOM).

windoww przeglądarkach służy dwóm celom: po pierwsze działa jako (dobrze określony) obiekt globalny ECMAScript, a po drugie działa jako obiekt hosta dostarczający informacji o środowisku przeglądarki. Jeśli chodzi o użycie windoww charakterze obiektu hosta, wolę być wyraźny i podać window.przedrostek: fakt, że locationdziała bez niego, jest tylko zbiegiem okoliczności, który pochodzi z windowschizofrenicznej natury. Ponadto, jak wskazano w innych odpowiedziach, ma to również tę zaletę, że chroni Cię w przypadku, gdy locationw bieżącym kontekście istnieje inna zmienna.

Jednym z dobrych powodów, dla których nie należy umieszczać przedrostków Dateani Mathz, window.jest to, że tworzy to kod, który nie działa w środowisku innym niż przeglądarka. Inne środowiska zazwyczaj nie zapewniają windowaliasu dla obiektu globalnego.


6

Częścią kodowania jest przejrzystość. W przeciwieństwie do Math czy Date, lokalizacja jest koncepcyjnie właściwością okna, więc kod staje się bardziej przejrzysty, aby ją uwzględnić. Okno." Najlepiej byłoby, gdyby przed minifikacją usunięto prefiks.

Prawdopodobnie masz rację, że wiele powodów jest historycznych. Javascript ma długą historię kopiowania i wklejania.


Tak sobie pomyślałem, ale jest tak wielu ludzi, którzy to robią; prawie każde źródło, które widzę, używa window.location. Jedyne strony "kontra", jakie udało mi się znaleźć, omawiają window.locationvs location.href, które też nie pomogły.
Reid,

5

Nie zawsze jest to kwestia stylu - starałem się ładować przyciski mediów społecznościowych asynchronicznie po zdarzeniu ładowania okna, dołączając elementy skryptu do fragmentu, a następnie dołączając ten fragment do dokumentu. Widgets.js Twittera używa location.hrefw kilku miejscach i powoduje następujący błąd w przeglądarce IE 8/9: Nieoczekiwane wywołanie metody lub dostępu do właściwości . Nie wiem, dlaczego, ale dzieje się tak tylko wtedy, gdy odwiedzam stronę za pośrednictwem linku z innej strony. Jeśli po prostu dodasz element skryptu do nagłówka lub użyjesz window.location.href, to się nie stanie, więc wydaje się to dziwne w IE 8/9 i createDocumentFragment().

Przykład:

<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

windowCelem jest domyślna przestrzeń nazw robocze, więc locationbędzie równa window.location.

Myślę, że użycie locationjest nieco niejednoznaczne, użyj window.locationdla jasności.


1
Głosowałem na tę odpowiedź (i prawie na żadną z pozostałych), ponieważ wyobraź sobie ten głupi przykład: function f() { var location = "home"; /* later on */ location = "http://google.com" } płacz

@ user166390 Zgodnie z tą logiką powinieneś pisać za window.documentkażdym razem. Wątpię, żeby ktokolwiek to robił.
superlukas

2

To tylko kwestia stylu.

Koncepcyjnie locationjest właściwością window(okno znajduje się w danym miejscu), w przeciwieństwie do Mathlub Date.


1

location jest właściwością obiektu window, więc można ją pobrać, żądając window.location. Ale jeśli nie określisz obiektu, JavaScript zakłada, że ​​chcesz obiektu window. Zatem samo żądanie lokalizacji jest tym samym, co żądanie window.location.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.