2010-11-22 15 views
12

Es macht total Sinn, es hier zu verwenden. Was wäre die Alternative? Wie kann ich im Allgemeinen vermeiden, sie zu verwenden und vor allem, warum es laut jsLint schlecht ist, Globals zu verwenden.Warum sind Globals schlecht?

(function($){ 
    $(function(){ 
    $body = $('body'); //this is the BAD Global 

    $.each(somearray ,function(){ $body.dosomething() }); 

    if (something){ 
    $body.somethingelse(); 
    } 

    }); 
}(jQuery)); 

Können Sie mir helfen, dies zu verstehen? Und gib mir eine bessere Lösung?

Antwort

18

Globals sind schlecht, weil sie sofort keine Probleme verursachen. Erst später, nachdem du sie überall benutzt hast, verursachen sie sehr hässliche Probleme - die du nicht mehr lösen kannst, ohne deinen Code von Grund auf neu zu schreiben.

Beispiel: Sie verwenden $body, um einige Funktionen zu definieren. Das funktioniert gut. Aber schließlich brauchst du auch einen Wert. Sie verwenden also $body.foo. Funktioniert gut. Dann fügen Sie $body.bar hinzu. Und dann, Wochen später, benötigen Sie einen anderen Wert, so dass Sie $body.bar hinzufügen.

Sie testen den Code und es scheint zu funktionieren. Aber Sie haben dieselbe Variable zweimal "hinzugefügt". Dies ist kein Problem, da JavaScript das Konzept "einmal eine neue Variable erstellen" nicht versteht. Es weiß nur "create, es sei denn es existiert bereits." So verwenden Sie Ihren Code und schließlich wird eine Funktion $body.bar ändern eine andere Funktion zu ändern. Selbst wenn Sie das Problem finden, brauchen Sie viel Zeit.

Deshalb ist es besser sicherzustellen, dass Variablen nur bei Bedarf angezeigt werden können. Auf diese Weise kann eine Funktion nicht eine andere unterbrechen. Dies wird umso wichtiger, je größer der Code wird.

2

sollten Sie es mit var $ Körper zu definieren, dann wäre es in den Anwendungsbereich dieser Funktion lokal sein, ohne var es von jedermann überschrieben werden könnte

(function($){ 
    $(function(){ 
    var $body = $('body'); //this is the local variable 

    $.each(somearray ,function(){ $body.dosomething() }); 

    if (something){ 
    $body.somethingelse(); 
    } 

    }); 
}(jQuery)); 
+0

Oder überschreiben einige 'andere' globale Variable namens $ body – Mchl

+0

ja, aber in diesem Beispiel würde es den globalen Wert ersetzen, so dass es nur im Bereich der Funktion – mpapis

+2

Ein Funktionsliteral mit lokalen Variablen, die in deklariert wurden Der gleiche Bereich, in dem die Funktion definiert wurde, wird als [closure] (http://jibbering.com/faq/notes/closures/) bezeichnet und sollte in jQuery ausführlich verwendet werden. – Phrogz

2

Globale Variablen mit anderen Scripts kollidieren könnte oder überschrieben werden . Wenn Sie kein globales benötigen, ist es ratsam, sie zu vermeiden. Verwenden Sie einfach var (oder let wenn Ihr JS-Version-Support ist größer als 1,7):

(function() { 
    var foo = 'bar'; 
    alert(foo); 
})(); 
2

Sie umschreiben könnte, dass als

var $body = $('body'); 

Das (die Verwendung des var Schlüsselwort) es machen würde eine lokale Variable, die für Ihre Zwecke ausreicht. Es ist immer noch in Reichweite in Ihrem each Rückruf.

Der Grund, warum es schlecht ist, Globals zu verwenden, ist, dass es von irgendetwas anderem überschrieben werden kann. Damit Ihr Code gut skaliert wird, hängt er davon ab, welche anderen Skripts Sie verwenden. Es ist vorzuziehen, das Skript so autark wie möglich zu halten, mit möglichst wenig Abhängigkeiten, die auf die Welt außerhalb davon zeigen.

0

jsLint ist sehr streng. Es ist wahrscheinlich nicht notwendig, sich damit aufzuhalten.

Aber wenn Sie sich schlecht fühlen, können Sie es tun, wie, wie Sie jQuery scoped:

(function($){ 
    $(function(){ 
    $.each(somearray ,(function($body){ $body.dosomething() })($('body')); 

    if (something){ 
    $('body').somethingelse(); 
    } 

    }); 
}(jQuery)); 
+3

Ich stimme zu, dass es nicht generell notwendig ist, sich über alles aufzuregen, sagt jsLint, aber ich würde das in diesem Zusammenhang nicht erwähnen, weil ich wirklich zustimme, dass Globals, wenn sie schmerzlos vermieden werden können, und in diesem Fall sein sollten code Die Variable kann als lokale Variable deklariert werden, und keine andere Aktion ist erforderlich. –

+0

@ David Hedlund: Einverstanden – kizzx2

Verwandte Themen