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

标签 javascript namespaces

最近在看一本很好的书; 'Maintainable Javascript' ,我发现了“use strict”编译指示的使用。

如果在全局范围内声明“use strict”似乎是一种不好的做法。推荐的方法是像这样在每个函数中直接使用严格模式:

// Non-strict code...

(function(){
  "use strict";

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

// Non-strict code...

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

谢谢。

最佳答案

严格模式适用于声明它的执行上下文和上下文包含的所有上下文(通过 eval 创建的上下文有一些 squidginess,但避免使用 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...
})();

在上面,严格模式不仅适用于匿名函数,还适用于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();
})();

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

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

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

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

})(MyModule);

“松散”代码可以调用 MyModule.doSomethingUseful,它总是在严格模式下运行。结果是您可以将严格模式应用于您的 代码,而不需要每个使用您的代码的人也使用它。非常方便。

关于javascript - 使用 Javascript 命名空间中的严格模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11293613/

相关文章:

ruby-on-rails - 同名类

javascript - Babel编译错误: Cannot find module core-js/library/fn/get-iterator

javascript - 使用 JavaScript 正则表达式提取子字符串;

javascript - 为什么 mongo 中的新文档有一个对象而不是 ObjectId?

testing - 加载测试命名空间

命名空间的 C# 命名约定

PHP 用变量声明类

php - 未找到 PrestaShop 模块类(命名空间)

javascript - 如何计算跨度中每个字符的宽度和高度

javascript - ajax POST 处理程序循环