我是否可以显式引用一个JavaScript全局变量';他被一个同名的本地人跟踪了?

我是否可以显式引用一个JavaScript全局变量';他被一个同名的本地人跟踪了?,javascript,Javascript,我已经看到很多关于JavaScript中全局范围和函数范围之间差异的帖子,这里的链接太多了。我也看到了我的问题。所以我想知道的是,当一个“更接近”的作用域也有一个同名的变量时,如何访问一个全局变量 var a = "global"; function b(){ var a = "local"; var magic = ...; // somehow put "global" in magic console.log(magic); // should print "global" }

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

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

仅在浏览器中,我发现可以使用
window.a
指定全局设置。是否有任何东西也可以在服务器端工作?

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

var项目={};//将“项目”的所有“全局”放在此容器中

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

如果它真的是全局变量(即不只是在外部范围内),您可以这样做:

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

输入功能代码

当控件进入执行时,将执行以下步骤 函数对象F(调用方)中包含的函数代码的上下文 提供此参数,以及调用者提供的参数列表:

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

注意,您不能在JSFIDLE中测试这一点,因为全局范围不是您定义a的地方

演示

var a=“全局”;
函数b(){
var a=“本地”;
var magic=(函数(名称){返回此[name]});
document.body.textContent='a:'+JSON.stringify(magic);//打印“全局”
}

b()我没有一个直接的答案,但是一个解决方法是使用一个完善的容器,例如window

window['a'] = "global";

这不是一个非常干净的解决方案,但它完成了任务

您可以通过全局对象访问全局对象。在本例中,窗口和当前上下文中的本地名称


这是一个。

使用您的代码作为答案的基础,您可以使用以下内容来实际提取“
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"});

在上述情况下,
“其他上下文”
将打印到控制台。

您的服务器端环境是什么?我想你可以在Node中用
全局
。为什么你不能给局部变量起另一个名字呢?@Smamatti,我相信在这种情况下我可以,我的要求基本上是出于学术兴趣。我正试图更好地理解作用域。@ChrisFrancis,我一直在致力于在Java中嵌入Rhino,但我想可能会在ECMAScript中指定一些标准,等等。听起来答案是“不,但是…”,就像下面dystroy的回答一样。这个解决方案已经在问题中指定了。这里需要一个不仅在浏览器环境下工作的解决方案。对不起,我已经有一段时间没有研究这个问题了,但是我想你的答案就是我想要的。谢谢,很抱歉花了这么长时间才回来!