示例:
var test = 'global value';
(function() {
var test = 'local value';
// how to get the 'global value' string
})();
鉴于主机环境未知的情况,这意味着我们不能假设可以通过window
名称访问全局对象。此外,该函数不允许接收任何参数!
答案 0 :(得分:4)
var test = 'global value';
(function() {
var test2 = 'local value';
console.log(test);
})();
真正的解决方案是修复你的代码,使你不关心你关心的全局变量。
您始终可以使用全局评估,这是最可靠的。
var test = 'global value';
function runEval(str) {
return eval(str);
}
(function() {
var test = 'local value';
console.log(runEval("test"));
})();
如果您不喜欢定义全局评估,可以使用Function
间接进行
var test = 'global value';
(function() {
var test = 'local value';
console.log(new Function ("return test;") () );
})();
以下适用于非严格模式
(function () {
var test = "shadowed";
console.log(this !== undefined && this.test);
})();
这个hack在破坏的实现中起作用
(function() {
var test = 'local value';
try { delete test; } catch (e) { }
console.log(test);
})();
答案 1 :(得分:1)
如何依赖this
作为全局对象(没有明确引用window
)。
console.log(this.test);
您也可以使用eval()
的间接调用(execScript()
此处用于IE目的,但您可以随意忽略,因为您提到不假设浏览器。)
console.log((window.execScript || eval)('test'));
答案 2 :(得分:1)
从根本上说,如果你想在严格模式代码中执行此操作,最重要的问题就是获取全局对象。值得庆幸的是,有一些简单的方法:var global = (1,eval)("this");
(在每个浏览器中都不起作用,因为它的行为在ES3中未定义,虽然在ES5中定义)或var global = (new Function("return this"))();
(确实如此)。
因此,将其与您需要的其他内容放在一起,您可以拥有如下功能:
function getGlobal(name) {
"use strict";
var global = (new Function("return this"))();
return global[name];
}
每次避免创建函数的成本可能会更好,所以像下面这样的东西会更好:
var getGlobal = (function() {
"use strict";
var global = (new Function("return this"))();
return function(name) {
return global[name];
}
})();
答案 3 :(得分:0)
这取决于。越过“不允许接受任何争论”的“厚颜无耻”的方式可能是使用call
:
var test = 'global value';
(function() {
var test = 'local value';
var globalTest = this.test;
}).call(this);
但是,如果在没有明确指定this
的情况下可以指望this
成为全局对象,那么this.test
将起作用。
答案 4 :(得分:0)
另一个解决方案是记住全局对象:
var test = "global";
function called() {
var test = "local";
alert(arguments.callee.window.test); // alerts "global"
}
called.window = this;
called();
答案 5 :(得分:0)
从 ES2020 开始就有 globalThis,所有现代浏览器都有 supported。
var test = 'global value';
(function() {
var test = 'local value';
console.log(globalThis.test); // 'global value'
})();