2012-09-15 17 views
9

ich die folgende Analyse von David Mark über die js Rahmen „Sencha“ lese: https://gist.github.com/3279190 und dort sagt er ...Gibt es einen Unterschied zwischen einer globalen Variablen und einer Eigenschaft des globalen Objekts

Was sie wollten, war eine globale Variable, aber sie endete mit einer Eigenschaft des globalen Objekts. Gemäß den Spezifikationen und (und der Implementierungshistorie) gibt es genügend Unterschiede zwischen den beiden, dass Vorsicht geboten ist, um sie nicht zu verwechseln (wie hier).

... aber soweit ich war bewusst, dass es kein Unterschied zwischen var my_global = 123; und (in einer Browser-Umgebung) window.my_global = 123; war (in diesem Beispiel angenommen, ich die Umgebung ein Browser war - daher der Einsatz von window, aber ich hätte einfach this.my_global stattdessen verwenden können, da offensichtlich das globale Objekt anders sein würde, wenn es in verschiedenen Umgebungen ausgeführt wird).

Aber diese geringfügige Abweichung zu ignorieren, ist es ein Unterschied zwischen einer Eigenschaft auf das globale Objekt zuweisen und eine globale Variable zu schaffen? Ich dachte nicht, und das Erstellen einer globalen Variable war nur eine weitere Möglichkeit, dem globalen Objekt eine Eigenschaft zuzuweisen.

Ich glaube, es kann ein Problem in einigen Browsern geben, wenn sie ein Element mit einer ID von "my_global" hatten, dann kann das anscheinend Probleme mit JavaScript verursachen, aber ich bin mir nicht sicher, wie/was das verursacht Problem (zB verursacht das Zuweisen einer Eigenschaft zum globalen Objekt das Element-ID-Problem oder gibt es eine globale Variable, die das Element-ID-Problem verursacht?)

Kann jemand dies bitte für mich klären?

Antwort

8

Eine Variable, die mit var im globalen Gültigkeitsbereich erstellt wird, erstellt eine Eigenschaft des globalen Objekts. Diese Eigenschaft hat jedoch ein anderes Verhalten als eine Eigenschaft des globalen Objekts, das nicht mit var erstellt wurde.

Zum einen gibt es einen Unterschied, wie eine Variablendeklaration ausgeführt wird: a var Aussage im globalen Bereich eine Eigenschaft des globalen Objekts erzeugt, bevor ein Code ausgeführt wird, ein Effekt, allgemein bekannt als Hissen, gut dokumentiert um das Web (siehe Referenzen unten).

Zweitens kann die globale Variable im Gegensatz zu einer Eigenschaft des globalen Objekts, das nicht mit var erstellt wurde, nicht mit dem Operator delete gelöscht werden (obwohl dies not true in older versions of IE ist). delete kann nicht zum Löschen von Variablen verwendet werden. Dieser Unterschied ist auf den internen Wert property attributes zurückzuführen, den jede Objekteigenschaft hat. Diese Attribute sind in der ECMAScript-Spezifikation angegeben. In ECMAScript 5 Hinsicht schafft var foo = "bar" eine Eigenschaft foo des globalen Objekts mit dem Attribute [[Configurable]]false während this.foo = "bar" (im globalen Bereich) erzeugt eine foo Eigenschaft mit [[Configurable]] Attribute true.

Referenzen:

+0

Danke für die Antwort so klar. Ich hatte eine Idee, wenn es um die Deklaration mit 'var' vs. nicht ging, aber hatte keine Ahnung von dem' [[Configurable]] 'Attribut. – Loktar

+0

Eine der größten Antworten, die ich auf SO gesehen habe. Ernst. –

-2
var count = 123 

var global_object = { 
    count:var = 456 
console.log(this.count) //returns 456 

} 

console.log(count) //returns 123 

console.log(global_object) //returns 456 

Oben wird count zuerst als globale Variable definiert. Dann wird es als eine Eigenschaft innerhalb des globalen Objekts definiert. Die Definition innerhalb des globalen Objekts ist lokal für dieses Objekt.

Ich sehe ein Problem mit meiner Antwort jetzt, dass nicht zu mir kommen, wenn ich den ersten gepostet. In der oben angeführten Antwort sehe ich richtigerweise, dass im Fall der globalen Variablen in der Frage "var" in ihrer Definition verwendet wird, aber im Falle des globalen Objekts wird kein "var" verwendet. Ich würde immer noch erwarten, dass der Umfang hier ins Spiel kommt (in ActionScript).

Ich habe ein paar andere Probleme mit dem obigen Beispiel. count: var = ist einfach falsch für mich. Vielleicht sollte das var count = 456 sein. Ich würde immer noch erwarten, dass eine Variable, die innerhalb einer Funktion deklariert wird, nur innerhalb dieser Funktion einen Gültigkeitsbereich hat. Daher sollten die console.log-Ausdrücke im Beispiel wahr sein.

+0

Glauben Sie nicht, dass das das OP ist? – m90

+0

'Fenster' ist ein globales Objekt. 'window.count === count // true' – Shea

0

Ich bin nicht bekannt, dass praktische Unterschied, aber es ist sicher, einige Unterschiede als globale zwischen Referenzierung oder als window.var. Ein einfaches Beispiel:

 
'use_strict'; 
console.info(window.foo); 
console.info(foo); 

window.foo wird einfach undefined zurückgeben. foo wird als Fehler undefiniert geben. Also ja, sie sind anders. Aber in gutem Code (mein Beispiel ist ein sehr schlechter Code) sieht es nicht so aus, als gäbe es einen Unterschied. (aber wenn es so ist, möchte ich wirklich mehr darüber wissen :))

Verwandte Themen