使用Javascript命名空间中的严格模式

Sam*_*uel 5 javascript namespaces

最近,在读一本非常好的书时; '可维护的Javascript',我发现使用"use strict"pragma.

如果在全球范围内宣布"使用严格"似乎是一种不好的做法.推荐的方法是在每个函数中直接使用严格模式,如下所示:

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code...
Run Code Online (Sandbox Code Playgroud)

是否可以将严格模式定义为整个命名空间而不是在每个函数中定义它?如果是,我可以有一两个代码示例吗?

谢谢.

T.J*_*der 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...
})();
Run Code Online (Sandbox Code Playgroud)

在上面的,严格的模式不仅适用于匿名函数,而是foo和bar为好.因此,例如,此代码将"起作用"(通过Implicit Globals的恐怖创建一个全局变量):

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

    foo();
})();
Run Code Online (Sandbox Code Playgroud)

... 这段代码失败了ReferenceError(唯一的变化是"use strict"):

(function() {
    "use strict";

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

    foo();
})();
Run Code Online (Sandbox Code Playgroud)

...因为严格模式所做的许多有用的事情之一就是摆脱了隐式全局变量的恐怖.

这是另一个例子,我们导出一个在严格模式下运行的函数,即使从非严格代码调用它:

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

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

})(MyModule);
Run Code Online (Sandbox Code Playgroud)

"松散"代码可以调用MyModule.doSomethingUseful,它始终以严格模式运行.结果是您可以将严格模式应用于您的代码,而不要求每个人使用您的代码也使用它.非常方便,那.