16

我已经看到了大量关于 JavaScript 中全局和函数范围之间差异的帖子,这里链接太多了。我还看到了关于 Python的确切问题。所以我想知道的是,当“更接近”的范围也有一个同名的变量时,如何访问全局变量?

var a = "global";
function b(){
  var a = "local";
  var magic = ...; // somehow put "global" in magic
  console.log(magic); // should print "global"
}

仅在浏览器中,我发现您可以使用它window.a来指定全局。有什么可以在服务器端工作的吗?

4

5 回答 5

12

如果它真的是一个全局的(即不仅仅是在外部范围内),你可以这样做:

var magic = (function(name){return this[name]}).call(null, "a");

来自 ECMAScript 的文档(10.4.3)

输入功能码

当控制进入函数对象 F 中包含的函数代码的执行上下文、调用者提供 thisArg 和调用者提供 argumentsList 时,将执行以下步骤:

如果函数代码是严格代码,则将 ThisBinding 设置为 thisArg。否则,如果 thisArg 为 null 或未定义,则将 ThisBinding 设置为全局对象。

请注意,您不能在 jsFiddle 中对此进行测试,因为全局范围不是您定义 a.

示范

var a = "global";

function b(){
  var a = "local";
  var magic = (function(name){return this[name]}).call(null, "a");
  document.body.textContent = 'a: '+JSON.stringify(magic); // print "global"
}

b();

于 2012-09-20T15:13:20.123 回答
3

没有标准可以做到这一点。出于我自己的目的,我总是将变量放在名称类似于项目名称的容器中:

变量项目 = {}; // 将“project”的所有“globals”放入这个容器中

这样,我可以在一个地方收集所有变量,如果我需要传递“全局变量”,我最多只能传递一个引用。

于 2012-09-20T15:12:45.677 回答
2

使用您的代码作为答案的基础,您可以使用以下内容来实际提取“ a”的全局版本,而不是本地版本:

var a = "global";
function b(){
  var a = "local";
  var magic = this.a; // somehow put "global" in magic
  console.log(magic); // should print "global"
}
b();

这仅在您以上述形式调用 b() 函数时才有效。一个不起作用的例子如下:

var a = "global";
function b(){
  var a = "local";
  var magic = this.a; // somehow put "global" in magic
  console.log(magic); // should print "global"
}
b.call({a : "other context"});

在上述情况下,"other context"将打印到控制台。

于 2013-02-25T22:26:44.803 回答
1

您可以通过全局对象访问全局。在这种情况下,window 和当前上下文中的本地名称。

这是一个小提琴示例

于 2012-09-20T15:17:24.463 回答
0

好吧,我没有直接的答案,但解决方法是使用完善的容器,例如窗口

window['a'] = "global";

这不是一个非常干净的解决方案,但它可以完成工作

于 2012-09-20T15:14:59.683 回答