如何在使用strict mode pragma时声明全局变量

时间:2012-02-22 15:31:11

标签: javascript

使用自调用函数来包装严格模式兼容代码(通常称为严格模式编译指示)被认为是一种好习惯:

(function(){
  "use strict";
  // Strict code here
}());

我的问题是如何在这种情况下声明全局变量?我今天所知道的三种选择:

备选方案1:

var GLOB = {};

(function(){
  "use strict";
}());

备选方案2:

(function(){
  "use strict";
  window.GLOB = {};
}());

备选方案3:

(function(win){
  "use strict";
  win.GLOB = {};
}(window));

任何偏好和动机?其他选择?

5 个答案:

答案 0 :(得分:52)

IMO替代3是最好的。但它假设window代表全局范围 - 对于浏览器而言是这样,但对于其他JS环境(命令行,Node.js等)则不然。

以下内容将全面运作:

(function(globals){
  "use strict";
  globals.GLOB = {};
}(this));

答案 1 :(得分:10)

我知道这是一个老问题,但有一个没有提到获得全球背景的方法:

(function(globals){
  "use strict";
  globals.GLOB = {};
}( (1,eval)('this') ));

(1,eval)('this')

将从全局上下文中评估this,因此您可以将其粘贴到您喜欢的任何位置,并始终获得全局上下文

答案 2 :(得分:1)

如果将方法1粘贴到另一个函数中,则方法1会失败。

使用方法3,可以更轻松地将方法导出到另一个名称空间。只需将window替换为frames[0]document即可将所有方法附加到自定义命名空间。

我推荐方法3,最后一个原因。

答案 3 :(得分:1)

alt 2和3的好处是它们将所有代码保存在“容器函数”中。在阅读代码时,很容易错过函数之外的一行代码。

此外:

  • “GLOB”应该是应用程序的名称。 - 您希望每个html / js文件允许多个应用程序,而不会发生名称冲突。

答案 4 :(得分:0)

Andrea Giammarchi有一个很好的技巧,可以在浏览器中运行。在你的自调用函数中定义一个名为globalEval的函数,如下所示:

(function () {
    "use strict";
    function globalEval(data) {
        data = data.replace(/^\s*|\s*$/g, "");
        if (data) {
            var head = document.getElementsByTagName("head")[0] || document.documentElement,
                script = document.createElement("script");
            script.type = "text/javascript";
            script.text = data;
            head.appendChild(script);
            head.removeChild(script);
        }
    }

    // use globalEval to stick variables into the global scope
    globalEval("var myGlobal = 1;");
    // myGlobal === 1
)();
// myGlobal === 1

如果要在其他范围内使用,请在自调用代码之外定义globalEval函数。