使用自调用函数来包装严格模式兼容代码(通常称为严格模式编译指示)被认为是一种好习惯:
(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));
任何偏好和动机?其他选择?
答案 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的好处是它们将所有代码保存在“容器函数”中。在阅读代码时,很容易错过函数之外的一行代码。
此外:
答案 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函数。