2012-07-02 13 views
5

最近、非常に良い本を読んでいるうちに、 'Maintainable Javascript'、 "use strict"プラグマの使用を発見しました。Javascriptを使った名前空間の厳密なモード

"use strict"は、グローバルスコープで宣言されていると悪い習慣に思えます。推奨される方法は、このように、各機能に直接strictモードを使用することです:

// Non-strict code... 

(function(){ 
    "use strict"; 

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

// Non-strict code... 

代わりに、各機能でそれを定義する名前空間全体にstrictモードを定義することが可能ですか?はいの場合は、1つまたは2つのコードサンプルを入手できますか?

ありがとうございます。

答えて

5

厳密なモードは、宣言されている実行コンテキストとコンテキストに含まれるすべてのコンテキストに適用されます(evalによってコンテキストが作成されますが、evalは使用しないでください)すべてのコードに適用するためのモジュールパターン:上記で

(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... 
})(); 

は、strictモードは、同様に無名関数に、しかしfoobarにないのみ適用されます。だから、このコードが「仕事」(The Horror of Implicit Globalsを介してグローバル変数を作成する)だろう例えば、のために:

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

    foo(); 
})(); 

... このコードはReferenceErrorで失敗し(唯一の変化は"use strict"です):

(function() { 
    "use strict"; 

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

    foo(); 
})(); 

...厳密なモードが行う多くの便利なことの1つは、暗黙的なグローバルの恐怖を取り除くためです。

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

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

})(MyModule); 

「ルーズ」のコードは常にstrictモードで実行さMyModule.doSomethingUsefulを呼び出すことができます。私たちは非厳密コードから呼び出された場合でも、strictモードで実行される関数をエクスポートどこ

はここでは、別の例です。あなたはコードに厳密なモードを適用できるということは、誰もがを使用してコードを使用することを必要とせずにコードを使用することです。とても便利です。

+0

編集のおかげで、Matt!私はそれを(厳密ではなく文字列で)たくさん... :-) –

0

最初の方法は、"use strict";プラグマを.jsファイルの最初の行に挿入するときです。したがって、そのファイルのすべてが厳密に評価されます。
それには本質的に間違いはありません。遅かれ早かれ、すべてのブラウザは古いjsコードを非推奨にします。実際の欠点だけが、古いコードを使用すると、潜在的に古いコードを破壊する可能性があります。

第二の方法は、このようなオブジェクトであるかもしれない:

TMP =新しいo.Pixel(300、300);

} // end 

このコードでは、「プライベート」変数を使用できます。 fは 'private' varであることに注意してください。

使い方は簡単です:

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

第三の方法はT.J.Crowderの、第四は、ダグクロックフォードのであるかもしれない... これらはまだ言語で正式に存在していない何かをエミュレートするだけで、さまざまな方法があります。

+0

'var contName = new function(){...'その構造はあなたが思っていることをしません。そして、OPは世界中でそれを使わない理由があると思ったことを告げました。 (私はそれらが何であるかわからない、私は決して**世界的に何でも** ...)そしてCrockfordの名前は "ダグラス"(または "ダグ")です。 –

+0

オブジェクトを作成します。名前が修正されました;) – CoR

+1

右、オブジェクトを作成します。無名関数の 'prototype'を使って、式の一部として定義しています。ラウンドアバウトで、誤解を招くような、オブジェクトを作成する方法です。 –

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

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

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

これもうまくいくと思います。

関連する問題