Javascript 如果存在同名的局部变量,如何访问闭包中的变量?

Javascript 如果存在同名的局部变量,如何访问闭包中的变量?,javascript,Javascript,这是我从谷歌代码游乐场拍的 这一切都没问题,但是如果我在内部函数中有一个与外部函数中的一个变量同名的局部变量,那么如何访问该变量呢 function outerFunction(someNum) { var someString = 'Hai!'; var content = document.getElementById('content'); function innerFunction() { var someString='Hello'; content.in

这是我从谷歌代码游乐场拍的

这一切都没问题,但是如果我在内部函数中有一个与外部函数中的一个变量同名的局部变量,那么如何访问该变量呢

function outerFunction(someNum) {
  var someString = 'Hai!';
  var content = document.getElementById('content');
  function innerFunction() {
    var someString='Hello';
    content.innerHTML = someNum + ': ' + someString;
    content = null; // IE memory leak for DOM reference
  }
  innerFunction();
}

outerFunction(1);

尝试使用this.varname引用闭包中的一个


在您的示例中是this.someString。

您不能,因为外部作用域的变量被内部函数上的变量所遮蔽

innerFunction
上的范围链如下所示:

innerFunction outerFunction global object ______________________ ________________________ _______________ |* someString = 'Hello'| <---- | someString = 'Hai!' | <---|* outerFunction| ---------------------- |* content = [HTMLElement]| | ..... | |* someNum (argument) | --------------- |* innerFunction | ------------------------- * Denotes a resolvable identifier from the scope of innerFunction. innerFunction outerFunction全局对象 ______________________ ________________________ _______________ |*someString='Hello'|你可以

  • 只需避免创建任何同名的局部变量,或
  • 在声明同名的局部变量之前,创建该闭包变量的局部副本(如果确实需要同名的局部变量)

(有一个解决方法,但在指出它实际上不起作用后将其删除)

闭包的局部变量“隐藏”外部函数中同名的变量,因此:

function outerFunction(s) {
  var someString = 'Hai!';
  function innerFunction() {
    var someString='Hello';
    alert(someString);
  }
  innerFunction();
}
outerFunction();

解决此问题的唯一方法是重命名变量,或传入要使用的变量:

function outerFunction(s) {
  var someString = 'Hai!';
  function innerFunction(outer) {
    var someString='Hello';
    alert(outer);
  }
  innerFunction(someString);
}
outerFunction();        

要了解范围链

}
外部功能(1)

我插入了一行var ss=someString;内部函数。然后,当我试图访问ss时,它返回undefinedVery相似/重复?问题:
变量的含义取决于内部函数的调用方式,因此只有当包含闭包范围的函数是内部函数作为方法调用的上下文时,此变量才会起作用。如果将该函数传递给其他对象,然后调用它,即使到闭包的链接仍然存在,
this
将不会指向它。True。我意识到这一点,并打算删除我自己的答案,但你的解释让我觉得值得留下来。:)你能再解释一下吗?我还没拿到这个东西@Sriram,@Sebastián,请看一看。@Sriram-更改变量名,或将外部变量作为参数传入。@CMS-Huh-这是Chrome:-在FF中对我来说也差不多。@CMS-非常好;现在看起来很完美。+1谢谢@CMS。这正是我想要的。出于某种原因,我认为变量声明可以隐藏形式参数(都在同一个函数中),但现在我看到它们都是同一个Variables对象上的属性。现在可以理解为什么改变
参数[0]
也会改变与参数同名的变量。我更喜欢严格模式行为,在这种行为中,我可以在不影响参数的情况下调整arguments对象。再次感谢。您永远不会调用
innerfunc()
而只调用外部函数。
copyofmyvar
将始终是
未定义的
,变量实例化过程发生在实际函数执行之前,作用域中遇到的变量初始化为
undefined
,这种情况发生在内部作用域中定义的
myvar
中,添加到变量对象中,然后初始化为
undefined
,该函数执行并进行赋值,此时外部作用域中的
myvar
已被隐藏。噢,谢谢,这意味着我的大部分答案实际上是假的。不客气,您可以查看更多详细信息。:)
function outerFunction(s) {
  var someString = 'Hai!';
  function innerFunction(outer) {
    var someString='Hello';
    alert(outer);
  }
  innerFunction(someString);
}
outerFunction();        
function outerFunction(someNum) {
var someString = 'Hai!';
var content = document.getElementById('content');
function innerFunction() {
this.someString = 'Hello'; 
content.innerHTML = someNum + ': ' + someString;
content = null; // IE memory leak for DOM reference
 }
    innerFunction();