2012-05-09 5 views
29

Ich sehe Warnungen, keine globalen Variablen in JavaScript zu verwenden, aber es scheint, dass der einzige Grund dafür ist, dass der globale Namensraum blockiert wird. Ich kann mir vorstellen, dass dies leicht behoben werden kann, indem alle Variablen in ein großes Objekt eingefügt werden. Nun stellt sich die Frage: Gibt es andere Gründe, keine anderen globalen Variablen als die Bequemlichkeit zu verwenden? Gibt es Leistungs- oder Kompatibilitätsprobleme mit ihnen?Warum werden globale Variablen als schlechte Praxis angesehen?

+2

möglich Duplikat von [Warum sind Globals schlecht?] (Http://stackoverflow.com/questions/4246284/why-are-globals-bad) und [andere Fragen] (http://stackoverflow.com/search? q = Javascript + warum + sind + global + Variablen + schlecht. –

+2

JavaScript oder andere Sprachen, zählt weniger. Hier ist die [kanonische Antwort, warum Globals schlecht sind] (http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil/148154#148154). –

Antwort

36

Sie überfluten den globalen Namespace und suchen langsamer als lokale Variablen.

Zunächst ist es immer eine schlechte Sache, viele globale Variablen zu haben, weil man leicht vergisst, dass man irgendwo eine Variable deklariert und sie irgendwo anders wieder deklariert. Wenn Ihre erste Variable lokal war, dann haben Sie kein Problem. Wenn es global war, wurde es gerade überschrieben. Dies wird noch schlimmer, wenn Sie in implizite globale Variablen geraten (z. B. wenn Sie someVar = someValue sagen, ohne einigeVar mit dem Schlüsselwort var zu deklarieren).

Zweitens brauchen globale Variablen länger, damit Javascript "findet" als lokale Variablen. Der Geschwindigkeitsunterschied ist nicht groß, aber es existiert .

Für weitere Lektüre und eine ausführlichere Erklärung, warum Globals als schlechte Praxis angesehen werden, können Sie this page überprüfen.

0

Grundsätzlich, weil sie von jedem Skript auf der Seite zugegriffen werden können und weil Sie den Namen im gleichen Bereich wiederholen können. Deshalb diesen Code viele Javascript-Engines:

(function(){ 
    var foo = 'foo',//Local 
    bar = 'bar';//Local 
    window.globalVar = foo + bar;//Global 
})(); 
alert(foo);//Error 
alert(bar);//Error 
alert(globalVar);//'foobar' 
5

Wenn Ihr Skript sehr lang ist und Sie verwenden diese Variablen aus vielen Funktionen wird es Ihre Debugging-Zeit, da der Wert der globalen Variablen erhöhen werden könnte geändert von überall her, wenn Sie verfolgen, wo sich dieser Wert auf einen nicht erwarteten Wert geändert hat, müssen Sie sie alle überprüfen.

Dieses Szenario ist noch schmerzhafter, wenn verschiedene Programmierer diese Variable von anderen Skripten auf Ihrer Seite ändern.

+2

Harder Debugging ist nur ein Grund, warum Globals schlecht sind. Andere sind unter [Warum sind Globals so böse] (http://programmers.stackexchange.com/questions/148108/why-is-global-state-so-evil/148154#148154) aufgeführt. –

2

Es sollte kein Problem mit globalen Variablen im Code sein, solange man sie in einem uniqe namespase/Objekt Einwickeln (Kollision mit Skripten zu vermeiden, die nicht von Ihnen sind)

Es gibt eine adventage von Verwendung von globalen Variablen in Javascript, und es leitet sich aus der Tatsache ab, dass JavaScript keine starke Sprache ist. Wenn Sie also einige komplexe Objekte als Argumente an eine Funktion übergeben, verlieren Sie durch die Verwendung von globalen Objekten die ganze Intellisence für diese Objekte (innerhalb des Funktionsbereichs.) und behalten diese Intelligenz bei. und wenn Sie Intelligenz haben, kann es tatsächlich die Debugging-Zeit verbessern (im Gegensatz zu dem, was andere sagten ...)

Ich persönlich finde das sehr nützlich und es hat sicherlich Platz in meinem Code.

(natürlich sollte man Alwayse die richtige Balance zwischen Einheimischen machen und Globals Variablen)

9

Globale Variablen deutlich Kopplung erhöhen, reduziert deutlich die Skalierbarkeit und die Testbarkeit des Codes. Sobald Sie beginnen, globale Variablen zu verwenden, müssen Sie jetzt wissen, wo und wie die Variable geändert wird (d. H. Einkapselung bricht). Die meisten der Literatur und Konventionen, die da draußen existieren, werden argumentieren, dass Leistung bei der Verwendung von Globalen die geringste Sorge ist.

Dies ist ein fantastic article outlining why globale Variablen verursachen Kopfschmerzen.

+3

Dies ist die beste Antwort. –

2

Kurz gesagt, verursachen globale Variablen (und mehr) die folgenden Probleme.

1) Variable Namenskonflikte - Wenn Sie an einem Team arbeiten und sowohl Sie als auch Ihr Kollege den gleichen Variablennamen im globalen Gültigkeitsbereich verwenden, überschreibt die zuletzt definierte Variable die ursprüngliche Variable. Dieses Offensichtliche kann verheerende Folgen haben.

2) Sicherheit - Speziell im Web hat jeder Benutzer Zugriff auf das Window- (oder globale) Objekt. Indem Sie Variablen dem globalen Gültigkeitsbereich zuordnen, geben Sie jedem Benutzer die Möglichkeit, Ihre Variablen zu sehen oder zu ändern.

3) Langsamer - Dies ist wohl vernachlässigbar, aber es existiert noch. Die Funktionsweise von JavaScript-Variablen-Lookups ist, dass die JavaScript-Engine nach dem aktuellen Bereich sucht, in dem die Variable nachgeschlagen wird. Wenn sie nicht gefunden werden kann, sucht sie nach dem nächsten übergeordneten Bereich. Wenn es dort nicht gefunden wird, wird es weiter nach oben schauen, bis es das globale Objekt erreicht, das nach dieser Variablen sucht. Wenn sich alle Ihre Variablen im globalen Bereich befinden, muss die JavaScript-Engine immer alle Bereiche durchlaufen, um schließlich den globalen Bereich zu erreichen, in dem die Variable gefunden werden kann.