Javascript 有没有办法访问外部范围';在当前作用域定义了一个相同的名称后,是否使用s变量?

Javascript 有没有办法访问外部范围';在当前作用域定义了一个相同的名称后,是否使用s变量?,javascript,Javascript,似乎不是: function o(){ var v = 1; function i(){ var v = 2; // any way at all, now, to access the 1 value? } } 但是有吗?没有,在i中,v符号完全遮蔽了o中的v,没有其他方法可以达到它。有了这个代码,i就无法到达o的v 当然,如果您对变量使用不同的名称,那么问题就不会出现了。:-) 如果在全局范围内没有代码,而不是o,则可以将v作为全局对象的属性进行访问,因为当全

似乎不是:

function o(){
  var v = 1;
  function i(){
    var v = 2;
    // any way at all, now, to access the 1 value?
  }
}

但是有吗?

没有,在
i
中,
v
符号完全遮蔽了
o
中的
v
,没有其他方法可以达到它。有了这个代码,
i
就无法到达
o
v

当然,如果您对变量使用不同的名称,那么问题就不会出现了。:-)


如果在全局范围内没有代码,而不是
o
,则可以将
v
作为全局对象的属性进行访问,因为当全局声明变量时,它将成为全局对象的属性。例如,这将在松散模式下工作:

var v = 1;
function i() {
    var v = 2;
    console.log("v == " + v);
    console.log("this.v == " + this.v);
}
i(); // Calling it like this makes `this` within the call the global object
那会显示

v == 2; this.v == 1 它可以在严格模式或松散模式下工作,但只能在浏览器中工作

但全球范围是一个特例。对于您引用的代码,不,没有办法到达那里。

如果您所指的“外部范围”是全局变量,那么浏览器将它们公开为
window.varname
,这意味着答案是“是的,它们是可访问的”。我知道这并不能回答关于范围的其他层的问题,但是对于globals,你有一个选择。
// Browsers only
var v = 1;
function i() {
    var v = 2;
    console.log("v == " + v);
    console.log("window.v == " + window.v);
}
i();