如何在不修改实用程序对象范围的情况下使用“use strict”?

时间:2014-08-19 08:03:48

标签: javascript scope use-strict

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

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在其范围之外不再可用。

2 个答案:

答案 0 :(得分:2)

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

有两个选项

1)就像吼叫一样,

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

OR

2)如果您想使用IIFE

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

如果您使用的是nodejs,则

global.StringUtils = {};

答案 1 :(得分:1)

由于EMCAScript5如何实施,您的选择有限。

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

您可以将代码划分为不同的文件,并在每个文件中指定哪些是严格的,哪些不是

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

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

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

(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
}());