W Internecie widzę ogromną liczbę programistów JavaScript, którzy piszą window.location
zamiast tylko location
. Byłem ciekawy, czy ktoś mógłby wyjaśnić, dlaczego. window
jest obiektem globalnym i dlatego nie trzeba go uwzględniać - prawda? Chodzi mi o to, że nie widzisz, jak ludzie piszą window.Math.floor
lub new window.Date()
, więc jestem ciekawy, dlaczego zostałoby to określone za pomocą location
.
Rozumiem, że location
jest 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 location
w 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 ...
window
jest.Częściowo ze względów bezpieczeństwa na wypadek, gdyby ktoś zdefiniował
location
zmienną gdzieś w łańcuchu zasięgu.window.location
sprawia, że jest to wyraźne odniesienie do własnościwindow
.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 })(); })();
źródło
Jest duża różnica między
window.location
i rodzimyMath
iDate
obiektów, które jest to, żeMath
iDate
rodzimych obiektów JavaScript, które są określone istnieć jako właściwości obiektu globalnego, natomiastwindow.location
jest 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ądocument
dowolny element DOM).window
w 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życiewindow
w charakterze obiektu hosta, wolę być wyraźny i podaćwindow.
przedrostek: fakt, żelocation
działa bez niego, jest tylko zbiegiem okoliczności, który pochodzi zwindow
schizofrenicznej natury. Ponadto, jak wskazano w innych odpowiedziach, ma to również tę zaletę, że chroni Cię w przypadku, gdylocation
w bieżącym kontekście istnieje inna zmienna.Jednym z dobrych powodów, dla których nie należy umieszczać przedrostków
Date
aniMath
z,window.
jest to, że tworzy to kod, który nie działa w środowisku innym niż przeglądarka. Inne środowiska zazwyczaj nie zapewniająwindow
aliasu dla obiektu globalnego.źródło
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.
źródło
window.location
. Jedyne strony "kontra", jakie udało mi się znaleźć, omawiająwindow.location
vslocation.href
, które też nie pomogły.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.href
w 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żyjeszwindow.location.href
, to się nie stanie, więc wydaje się to dziwne w IE 8/9 icreateDocumentFragment()
.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>
źródło
window
Celem jest domyślna przestrzeń nazw robocze, więclocation
będzie równawindow.location
.Myślę, że użycie
location
jest nieco niejednoznaczne, użyjwindow.location
dla jasności.źródło
function f() { var location = "home"; /* later on */ location = "http://google.com" }
płaczwindow.document
każdym razem. Wątpię, żeby ktokolwiek to robił.To tylko kwestia stylu.
Koncepcyjnie
location
jest właściwościąwindow
(okno znajduje się w danym miejscu), w przeciwieństwie doMath
lubDate
.źródło
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.
źródło
W rzeczywistości są identyczne. Technicznie rzecz biorąc, obiekt „
window
” JEST tym samym, co główny zasięg dla zmiennych JavaScript.źródło