0

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

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

4

2 回答 2

2

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

有两种选择

1)像下面这样说,

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

或者

2)如果你想使用如下定义IIFE

window.StringUtils = {};

如果你正在使用nodejs这将是

global.StringUtils = {};
于 2014-08-19T08:07:19.230 回答
1

由于 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
}());
于 2014-08-19T08:14:36.447 回答