window.location versus nur location

79

Im gesamten Web sehe ich eine große Anzahl von JavaScript-Programmierern, die window.locationstatt nur schreiben location. Ich war neugierig, ob jemand eine Erklärung dafür geben könnte, warum. windowist das globale Objekt, und daher ist es nicht notwendig, es einzuschließen - nicht wahr? Ich meine, du siehst keine Leute schreiben window.Math.flooroder new window.Date(), also bin ich neugierig, warum es mit spezifiziert wird location.

Ich verstehe, dass locationdies als "Eigenschaft" des Fensters angesehen wird, in dem Sie sich befinden, was meiner Meinung nach Sinn macht. Trotzdem sehe ich keinen Grund, das globale Objekt anzugeben. Es ist nicht möglich, überhaupt zu überschreiben location, nicht ohne die Seite umzuleiten.

Ist dies also nur eine Eigenart, die so lange verwendet wurde, dass sie in die Art und Weise, wie wir JavaScript schreiben, integriert wurde, oder gibt es einen konkreten Grund, Dinge auf diese Weise zu tun? Ich habe Google überprüft, aber leider habe ich nichts gefunden ...

Reid
quelle

Antworten:

85

Ich verwende window.locationmeinen Code immer aus zwei Hauptgründen:

  1. Es ist eine gute Angewohnheit, globale Variablen nach Möglichkeit zu vermeiden. Die Verwendung des window.Präfixes erinnert mich daran, dass die Variable global ist und andere nicht.
  2. Aufgrund der Art des Gültigkeitsbereichs von Javascript können Sie Variablen überschreiben, die weiter oben im Bereichsbaum festgelegt sind. Dies bedeutet, dass Sie var locationirgendwo in einem enthaltenen Bereich festgelegt haben könnten (es ist kein unwahrscheinliches Wort, das als Variablenname verwendet wird), und Sie würden stattdessen daran arbeiten.

Für mich ist die Klarheit des Zwecks beim Codieren sehr wichtig, da es mir hilft, das Schreiben von Fehlern zu vermeiden und sie dann zu finden, wenn ich dies tue.

einsamer Tag
quelle
Ich stelle mir auch vor, dass es schneller sein kann, JS zu sagen, wo die Variable zu finden ist, anstatt sie über die Bereichskette bis zum globalen Bereich zu schleifen.
Rayjax
3
@Rayjax Nein, eigentlich, weil JS auch die Scope-Kette durchlaufen muss, um festzustellen, was window ist.
einsamer
16

Teilweise aus Sicherheitsgründen, falls jemand locationirgendwo in der Scope-Kette eine Variable definiert . das window.locationmacht es zu einem expliziten Verweis auf die Eigenschaft von window.

Beispiel: 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
    })();

})();
user113716
quelle
11

Es gibt einen großen Unterschied zwischen window.locationund dem nativen Mathund DateObjekte, die ist , dass Mathund Datesind native JavaScript - Objekte , die angegeben werden als Eigenschaften des globalen Objekts bestehen, während window.locationeine Eigenschaft des ist window Host - Objekt (ein Host - Objekt ist ein Objekt repräsentiert einen Aspekt Die Umgebung wird von der Umgebung bereitgestellt und unterliegt nicht denselben Regeln wie native JavaScript-Objekte. Andere Hostobjekte umfassen documentund alle DOM-Elemente.

windowIn Browsern dient dies zwei Zwecken: Erstens als (gut spezifiziertes) globales ECMAScript-Objekt und zweitens als Host-Objekt, das Informationen über die Browserumgebung bereitstellt. Für die Verwendung windowin seiner Host-Objekt-Kapazität bevorzuge ich es, explizit zu sein und das window.Präfix anzugeben: Die Tatsache, dass es locationohne es funktioniert, ist nur ein Zufall, der aus windowder schizophrenen Natur stammt. Wie aus anderen Antworten hervorgeht, hat dies auch den Vorteil, dass Sie in dem Fall geschützt werden, in dem locationim aktuellen Kontext eine andere Variable vorhanden ist.

Ein guter Grund dafür, kein Präfix Dateoder kein Präfix Mathzu verwenden, window.besteht darin, dass dadurch Code erstellt wird, der in einer Umgebung ohne Browser nicht funktioniert. Andere Umgebungen bieten windowim Allgemeinen keinen Alias ​​für das globale Objekt.

Tim Down
quelle
6

Ein Teil der Codierung ist Klarheit. Im Gegensatz zu Mathematik oder Datum ist der Speicherort konzeptionell eine Eigenschaft des Fensters, sodass der Code klarer wird, ihn einzuschließen. Das Fenster." Das Präfix sollte idealerweise zur Minimierung entfernt werden.

Sie haben wahrscheinlich Recht, dass ein Großteil des Grundes historisch ist. Javascript hat eine lange Geschichte des Kopierens und Einfügens.

fuzzyTew
quelle
Das habe ich mir gedacht, aber es gibt so viele Leute, die das tun. So ziemlich jede Quelle, die ich sehe, verwendet window.location. Die einzigen "Versus" -Seiten, die ich finden konnte, diskutieren window.locationvs location.href, was auch nicht geholfen hat.
Reid
5

Es ist nicht immer nur eine Frage des Stils - ich habe versucht, Social-Media-Schaltflächen nach dem Ladeereignis des Fensters asynchron zu laden, indem Skriptelemente an ein Fragment angehängt und dieses Fragment dann an das Dokument angehängt wurden. Die Widgets.js von Twitter werden location.hrefan mehreren Stellen verwendet und haben im IE 8/9 den folgenden Fehler verursacht: Unerwarteter Aufruf der Methode oder des Eigenschaftenzugriffs . Ich habe nicht herausgefunden warum, aber dies passiert nur, wenn ich die Seite über einen Link von einer anderen Seite besuche. Wenn Sie das Skriptelement nur an den Kopf anhängen oder verwenden window.location.href, tritt dies nicht auf, sodass es mit IE 8/9 und etwas seltsam erscheint createDocumentFragment().

Beispiel:

<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>
Rhurkes
quelle
3

Das windowObjekt wird der Standardarbeitsnamensraum, so locationwird gleich sein,window.location .

Ich denke, dass die Verwendung locationetwas mehrdeutig ist, window.locationaus Gründen der Klarheit.

Jacob Relkin
quelle
1
Ich habe für diese Antwort gestimmt (und fast keine der anderen), weil ich mir dieses dumme Beispiel vorstellen kann: function f() { var location = "home"; /* later on */ location = "http://google.com" } cry
@ user166390 Nach dieser Logik sollten Sie window.documentjedes Mal schreiben . Ich bezweifle, dass jemand das tut.
Superlukas
2

Es ist nur eine Frage des Stils.

Konzeptionell locationist eine Eigenschaft von window(das Fenster befindet sich an einem Ort), im Gegensatz zu Mathoder Date.

SLaks
quelle
1

location ist eine Eigenschaft des Fensterobjekts, sodass Sie es abrufen können, indem Sie window.location anfordern. Wenn Sie jedoch kein Objekt angeben, geht JavaScript davon aus, dass Sie das Fensterobjekt möchten. Das Anfordern eines Standorts entspricht also dem Anfordern von window.location.

Arlomedia
quelle
0

Sie sind tatsächlich identisch. Technisch gesehen ist das Objekt " window" dasselbe wie der Stammbereich für Javascript-Variablen.

Adam Batkin
quelle