【问题标题】:How to use "use strict" without modifying the scope of my utilities objects?如何在不修改实用程序对象范围的情况下使用“使用严格”?
【发布时间】:2014-10-12 06:13:31
【问题描述】:

我正在使用几个全局实用程序对象,例如:

var StringUtils = {
    // ...
    equalsIgnoreCase: function(string1, string2) {
        return string1.toUpperCase() === string2.toUpperCase();
    }
    // ...
};

在这种情况下如何使用"use strict"?我尝试了以下方法:

(function() {
    "use strict";

    var StringUtils = {
        // ...
        equalsIgnoreCase: function(string1, string2) {
            return string1.toUpperCase() === string2.toUpperCase();
        }
        // ...
    };

})();

但您可以想象,StringUtils 在其范围之外不再可用。

【问题讨论】:

  • 为什么要在 IIFE 中包装 StringUtils?
  • @Satpal 因为我认为这是使用“使用严格”的正确语法。我是不是误会了什么?
  • 如果它是全局的,为什么不使用 IIFE 并将其设置为 window.StringUtils = { ... }

标签: javascript scope use-strict


【解决方案1】:

当您在 IIFE 中定义对象时,它绝对是该 IIFE 的本地对象。

有两种选择

1) 像下面这样说,

"use strict";
var StringUtils = {
   equalsIgnoreCase: function(string1, string2) {
       return string1.toUpperCase() === string2.toUpperCase();
   }
};

2)如果你想使用IIFE

,请定义如下
window.StringUtils = {};

如果您使用的是nodejs,这将是

global.StringUtils = {};

【讨论】:

  • 全局范围内非严格的代码呢?
  • @RGraham 对不起,我没听明白,你是什么意思。
  • 假设您正在使用一个外部库,该库也使用全局函数并且它们并不严格——这可能会导致它们抛出错误。这是正确的,这只是 3rd 方代码的一个陷阱。
  • 好吧,老实说,我想如果我在一个 JS 文件的开头加上“use strict”,它就会为任何其他包含的文件启用该模式......但经过一些尝试,我注意到它只启用了上述文件的模式。也就是说,您的第一个解决方案适合我的需求;)
【解决方案2】:

由于 EMCAScript5 所说的实现方式,您的选择有点有限。

您可以浏览所有功能块,除了您想要全局的功能块并添加“使用严格”。这可能很乏味,但确保只有您想要的代码块是严格的。虽然这会在使用 JS lint 时抛出“错误”

你可以将代码分成不同的文件,并在每个文件中指定哪个严格,哪个不严格

最后,您可以将所有“全局”函数放在脚本的顶部,然后在它们下方添加“use strict”语句;低于它的任何东西都将是严格的。

所有 3 种方法都允许您从严格块中访问非严格对象。

就您的代码块而言,建议将整个 js 文件包装在一个函数中;这有助于向后兼容,同时在整个文件中强制使用严格:

(function () {
    'use strict';

    // window.StringUtils = { 
    // GLOBAL.StringUtils = {
    var StringUtils = {
        // ...
        equalsIgnoreCase: function(string1, string2) {
            return string1.toUpperCase() === string2.toUpperCase();
        }
        // ...
    };

    // add the rest of your code here
}());

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2015-07-19
    • 1970-01-01
    相关资源
    最近更新 更多