严格模式适用于声明它的执行上下文和上下文包含的所有上下文(在通过创建的上下文周围有一些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...
})();
在上面,严格模式不仅适用于匿名函数,而且也适用于foo
和bar
。因此,例如,此代码将“工作”的地方(通过隐式全局的恐怖创建一个全局变量):
(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
,它始终以严格模式运行。结果是您可以将严格模式应用于您的代码,而无需每个使用您的代码的人也使用它。很方便,那个。