如何检索阴影全局变量的值?

时间:2011-11-24 00:14:46

标签: javascript variables

示例:

var test = 'global value';

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

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

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

6 个答案:

答案 0 :(得分:4)

修复

var test = 'global value';

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

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

真正的解决方案是修复你的代码,使你不关心你关心的全局变量。

评估

您始终可以使用全局评估,这是最可靠的。

Example

var test = 'global value';

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

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

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

如果您不喜欢定义全局评估,可以使用Function间接进行

Live Example

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);

jsFiddle

您也可以使用eval()的间接调用(execScript()此处用于IE目的,但您可以随意忽略,因为您提到不假设浏览器。)

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

jsFiddle

答案 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'
})();