Ich lese die Dokumente von backbone.js und sehe viel Code, der dem Fensterobjekt Attribute zuweist:
window.something = "whatever";
Was ist der Unterschied zwischen dem Aufrufen dieses Codes und dem Zuweisen der Variablen und dem Erstellen einer globalen Variablen wie folgt:
something = "whatever";
Ich gehe davon aus, dass es eine andere Art von Umfang und / oder Unterschied im Objektbesitz gibt (Fenster ist der Eigentümer gegenüber nicht), aber ich interessiere mich für das Detail zwischen den beiden und warum ich Fenster verwenden würde, anstatt es nicht zu verwenden.
javascript
attributes
scope
Derick Bailey
quelle
quelle
Antworten:
Kein Unterschied. Sie haben beide den gleichen Effekt (Im Browser
window
befindet sich der globale Kontext 1 ).window.foo = "bar"
setzt die Eigenschaftfoo
aufwindow
.foo = "bar"
zeigt entweder einen Tippfehler oder absichtlich global an.Da ich noch einmal überprüfen muss, ob es sich um einen Tippfehler handelt oder nicht, finde ich es persönlich besser lesbar , ihn
window.foo
direkt einzustellen .Außerdem ist im strengen ES5-Modus
foo = "bar"
eine unzulässige Zuweisung, da siefoo
nicht deklariert ist und a auslöstError
.Bearbeiten:
Wie in den Kommentaren erwähnt,
foo = "bar"
wird die Gültigkeitsbereichskette für die Variablefoo
vollständig durchsucht und neu zugewiesen,"bar"
wenn sie gefunden wird. Wird es nicht gefunden, wird eine neue globale Variable erstellt.Außerdem weisen
window.foo = "bar"
Sie einem Objekt nur eine Eigenschaft zu, die mit gelöscht werden kanndelete window.foo
.In ES5 Strict - Modus ist es ungültig zu
delete
einer Variablen.1 In anderen Umgebungen wie node.js und Web Workers gibt es möglicherweise einen anderen Namen für das globale Objekt und ist
window
möglicherweise überhaupt nicht vorhanden. Node.js verwendetglobal
und Web Worker verwendenself
.quelle
window.foo = bar;
setzt foo auf das Fensterobjekt.foo = bar;
Durchsucht die Bereichskette, bis sie gefunden wirdfoo
, was möglicherweise das globale Objekt ist, aber nicht immer.window
der Annahme, dass es sich um das globale Objekt handelt, ist das von @kennebec beschriebene Verhalten korrekt. Ältere Versionen des IE stimmen jedoch nicht überein.Beide machen das Gleiche. Wenn Sie jedoch
auf eine
window
Eigenschaft zugreifen , wissen Sie sicher, dass Sie auf eine globale Variable zugreifen, unabhängig davon, in welchem Bereich Sie sich befinden.Beispiel:
globalVar = "smth"; function(){ var globalVar = 2; alert(globalVar);// points to the current scope globalVar alert(window.globalVar);// points to the original globalVar }
Mit anderen Worten: Wenn Sie mit Globals arbeiten möchten, ist es etwas sicherer, über deren Container auf sie zuzugreifen:
window.variable
quelle
Der Schlüssel ist, wie Raynos anspielte, dass er explizit für das Fensterobjekt festgelegt wird. Im Browser ist das globale Objekt dasselbe wie das Fensterobjekt, in anderen Umgebungen (z. B. node.js oder in einer Webansicht auf einem mobilen Gerät) möglicherweise nicht.
quelle
Der Unterschied besteht darin, dass ein
window.foo = bar;
späteres Refactoring nicht abgefangen werden kann. Verwendenfoo = bar;
bedeutet, dass der Code, wenn er zu einem späteren Zeitpunkt in einen definierten Abschluss verschobenvar foo
wird, nicht mehr für das globale Objekt festgelegt wird.quelle
Einen weiteren Punkt hinzufügen:
Wenn Sie eine nicht deklarierte Variable direkt referenzieren (ohne - window oder typeof zu verwenden ), erhalten Sie eine Variable, deren Fehler nicht definiert ist .
Beispiele:
// var unDecVariable if (unDecVariable != null) // Error: unDecVariable is not defined { // do something } if (window.unDecVariable != null) // No Error { // do something } if (typeof unDecVariable != 'undefined' && unDecVariable != null) // Alternative way { // do something }
quelle
Nicht aufgelöste Referenzen (auch als nicht deklarierte Variablen bezeichnet) sind eigentlich keine Variablen. Sie werden dem globalen Objekt als Eigenschaft hinzugefügt. [5c]
Im strengen Modus ("use strict") lösen ungelöste Referenzen einen ReferenceError aus. Dies soll verhindern, dass dem globalen Objekt Eigenschaften hinzugefügt werden, die als deklarierte Variablen gedacht waren. In diesem Fall würden Sie window.foo = "bar" verwenden, wenn Sie dem globalen Objekt eine Eigenschaft hinzufügen möchten. [5a]
quelle