我是否可以显式引用一个JavaScript全局变量';他被一个同名的本地人跟踪了?
我已经看到很多关于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" }
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的回答一样。这个解决方案已经在问题中指定了。这里需要一个不仅在浏览器环境下工作的解决方案。对不起,我已经有一段时间没有研究这个问题了,但是我想你的答案就是我想要的。谢谢,很抱歉花了这么长时间才回来!