厳密モードは、それが宣言された実行コンテキストと、コンテキストに含まれるすべてのコンテキストに適用されます(を介して作成されたコンテキストの周りにいくらかのsquidginessがありますeval
が、使用eval
を避け、squidginessを避けます)。したがって、通常はモジュールパターンを使用して適用します。すべてのコードに:
(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モードは無名関数だけでなく、にも適用さfoo
れbar
ます。したがって、たとえば、このコードが「機能する」場合(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);
「緩い」コードはMyModule.doSomethingUseful
、を呼び出すことができます。これは常に厳密モードで実行されます。結果として、コードを使用するすべての人がそれを使用する必要なしに、コードに厳密モードを適用できます。とても便利です。