Javascript Variablen aus dem globalen Namespace raushalten


Wie kann ich Javascript Variablen verwenden ohne dass diese mit z.B. externen Frameworks kollidieren?

Manchmal verwendet man externe Javascript-Frameworks die bereits selbst Variablen im globalen Namespace deklarieren.

Beispiel:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Test</title>
        <script type="text/javascript" src="//code.jquery.com/jquery-2.2.0.min.js"></script>
        <script type="text/javascript">
            var jQuery = 'ich bin nicht jQuery';
            console.log(jQuery);
        </script>
    </head>
    <body>
        F 12 für Console...
    </body>
</html>

In diesem Fall existiert dann die Variable „jQuery“ bereits.
Würde man die Variable neu deklarieren wäre jQuery nicht mehr vorhanden.
Um solche Kollisionen zu vermeiden gibt es einen relativ einfachen Ansatz.
Einfach den eigenen Code in eine anonyme sich selbst aufrufende Funktion packen:

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title>Test</title>
        <script type="text/javascript" src="//code.jquery.com/jquery-2.2.0.min.js"></script>
        <script type="text/javascript">
            (function(w) {
                var jQuery = 'ich bin nicht jQuery';
                console.log(jQuery);
                console.log(w.jQuery);
                console.log(window.jQuery);
                console.log(window===w);
            })(window);
        </script>
    </head>
    <body>
        F 12 für Console...
    </body>
</html>

Alle Variablen die innerhalb der Funktion deklariert werden sind lediglich in dieser Funktion gültig.
Als Parameter können ein oder mehrere Argumente übergeben werden. Somit kann man von außen x-beliebige Variablen, Objekte oder Funktionen in den privaten Scope transportieren.
So kann eine Kollision mit Variablen außerhalb vermieden werden.

Weitere Informationen und interessante Ansätze:

http://javascript.crockford.com/code.html

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.