2012-07-02 7 views
5

Vor kurzem beim Lesen eines sehr guten Buches; 'Maintainable Javascript', entdeckte ich die Verwendung von "Use Strict" Pragma.Strict-Modus in einem Namespace mit Javascript

Die "Use strict" scheint eine schlechte Praxis zu sein, wenn sie im globalen Geltungsbereich deklariert wird. Der empfohlene Weg ist, den Strict-Modus direkt in jeder Funktion wie folgt zu verwenden:

// Non-strict code... 

(function(){ 
    "use strict"; 

    // Define your library strictly... 
})(); 

// Non-strict code... 

Ist es möglich, den strikten Modus zu einem gesamten Namensraum zu definieren, anstatt es in jeder Funktion zu definieren? Wenn ja, kann ich ein oder zwei Code-Beispiele haben?

Vielen Dank.

Antwort

5

Strict-Modus gilt für den Ausführungskontext, in dem sie deklariert ist und alle Kontexte, die den Kontext enthält (mit etwas squidginess erstellt um Kontexte über eval, aber vermeiden eval verwenden und die squidginess vermeiden), so in der Regel würden Sie verwenden das Modul Muster es auf alle Ihre Code anwenden:

(function() { 
    "use strict"; 

    function foo() { 
    } 

    function bar() { 
    } 

    // ...presumably code hooking up `foo` and `bar` to events 
    // or otherwise using them -- or of course, you could export 
    // them from the scope... 
})(); 

im obigen Strict-Modus gilt nicht nur für die anonyme Funktion, sondern foo und bar auch. So zum Beispiel, wo dieser Code würde "Arbeit" (eine globale Variable über The Horror of Implicit Globals erstellen):

(function() { 
    function foo() { 
     someNameThatIsntDefined = 42; // Blech, creates implicit global 
    } 

    foo(); 
})(); 

... diesen Code schlägt mit einer ReferenceError (der einzigen Änderung ist die "use strict"):

(function() { 
    "use strict"; 

    function foo() { 
     someNameThatIsntDefined = 42; // Throws ReferenceError 
    } 

    foo(); 
})(); 

... weil eine der vielen nützlichen Dinge, die Strict-Modus ist der Schrecken der impliziten Globals nicht loswerden.

Hier ist ein weiteres Beispiel, wo wir eine Funktion exportieren, die im strikten Modus läuft, auch wenn aus nicht-strengen Code genannt:

var MyModule; 
MyModule = MyModule || {}; 
(function(mod) { 
    "use strict"; 

    mod.doSomethingUseful = doSomethingUseful; 
    function doSomethingUseful() { 
     // ... 
    } 

})(MyModule); 

„Loose“ Code MyModule.doSomethingUseful nennen kann, die immer im Strict-Modus läuft. Das Ergebnis ist, dass Sie strengen Modus auf Ihre Code anwenden können, ohne dass jeder mit Ihren Code auch verwenden. Sehr praktisch, dass.

+0

Danke für die Bearbeitung, Matt! Ich mache das (string statt strict) viel ... :-) –

0

Erste Möglichkeit ist, wenn Sie "use strict"; Pragma in der ersten Zeile der .js-Datei setzen. Also wird ALLES in dieser Datei streng ausgewertet.
Da ist nichts in sich falsch. Früher oder später werden alle Browser den alten js-Code veraltet machen. Ein echter Nachteil könnte sein, dass alter Code möglicherweise zerstört wird, wenn Sie ihn verwenden.

Zweite Art und Weise könnte ein Objekt wie folgt sein:

tmp = new o.Pixel (300, 300);

} // end 

Dieser Code ermöglicht es Ihnen, "private" Variablen zu haben. Beachten Sie, dass f auch eine 'private' Var.

Die Verwendung ist einfach:

var rvar = contName.rnd(5); 
var obj = new contName.Pixel(300, 300) 

Dritter Weg T.J.Crowder sein könnte das vierte Doug Crockford ist ... Dies sind nur verschiedene Möglichkeiten, etwas zu emulieren, die offiziell in einer Sprache noch nicht ist.

+0

'var contName = new function() {...' Dieses Konstrukt macht nicht das, was es zu tun scheint. Und das OP wies darauf hin, dass er/sie dachte, dass es Gründe gäbe, es nicht global zu benutzen. (Ich weiß nicht, was das ist, denn ich tue niemals ** irgendwas ** weltweit ...) Und Crockfords Name ist Douglas (oder "Doug"). –

+0

Es erstellt ein Objekt. Name korrigiert;) – CoR

+1

Richtig, es schafft ein Objekt. Verwenden Sie den "Prototyp" aus der anonymen Funktion, die Sie als Teil des Ausdrucks definieren. Es ist ein umständlicher und irreführender Weg, ein Objekt zu erschaffen. –

0
var Module = (function() { 
    "use strict"; 

    var f = function() { 
     // do stuff 
    } 

    return { // return your namespace 
     "myModuleFunction": f 
    } 
})(); 

Ich denke, das sollte auch funktionieren.

Verwandte Themen