网站搜索

javascript - 如何获取被遮蔽的全局变量的值?


示例:

var test = 'global value';

(function() {
    var test = 'local value';

    // how to get the 'global value' string
})();

鉴于宿主环境未知,这意味着我们不能假设全局对象可以通过 window 名称访问。此外,该函数不允许接收任何参数!

答案#1

解决方法

var test = 'global value';

(function() {
    var test2 = 'local value';

    console.log(test);
})();

真正的解决办法是修复你的代码,这样你就不会遮蔽你关心的全局变量。

评估工作方法

你总是可以使用全局 eval,它是最可靠的。

例子

var test = 'global value';

function runEval(str) {
  return eval(str);
}

(function() {
    var test = 'local value';

    console.log(runEval("test"));
})();

如果你不想定义全局 eval,你可以使用 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);
})();

而且这个技巧在有缺陷的实现中也有效

(function() {
    var test = 'local value';

    try { delete test; } catch (e) { }

    console.log(test);
})();

答案#2

依靠它的 this 作为全局对象(没有显式引用 window)怎么样。

console.log(this.test);

jsFiddle。

你也可以使用对 eval() 的间接调用(execScript() 是为 IE 而存在,但正如你提到的不假设浏览器,可以随意忽略)。

console.log((window.execScript || eval)('test'));

jsFiddle。