嚴格模式適用於聲明它的執行上下文以及上下文包含的所有上下文(通過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...
})();
在上面,嚴格模式不僅適用於匿名函數,而是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();
})();
...因爲嚴格模式所做的許多有用的事情之一是擺脫隱含的全局變量的恐懼。
這裏是另外一個例子,在我們的出口,在嚴格的模式下運行,從非嚴格的代碼調用,即使一個功能:
var MyModule;
MyModule = MyModule || {};
(function(mod) {
"use strict";
mod.doSomethingUseful = doSomethingUseful;
function doSomethingUseful() {
// ...
}
})(MyModule);
「寬鬆」的代碼可以調用MyModule.doSomethingUseful
,它始終嚴格模式下運行。結果是,您可以應用嚴格模式您的代碼,而不要求您的代碼也使用它的每個人都使用。非常方便,那。
感謝您的編輯,馬特!我這樣做(字符串,而不是嚴格)很多... :-) –