我可以显式引用被同名本地阴影的JavaScript全局变量吗?

Cod*_*rer 16 javascript

我已经看到很多关于JavaScript中全局和功能范围之间差异的帖子,这里有很多链接.我也看到了关于Python的确切问题.所以我想知道的是,当"更接近"的范围也有一个具有相同名称的变量时,如何访问全局变量?

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

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

Den*_*ret 12

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

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

从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();
Run Code Online (Sandbox Code Playgroud)