JavaScript访问内部和外部作用域中同名的本地变量

17

给定以下JavaScript代码:

var someFunction = function(id) {
  //do some stuff
  var modifyId = function(id) {
     //do some stuff
     outer.id = id; //is there any way to modify the id variable in the outer scope from here?
  }
}

如何在内部函数作用域中修改传递到外部函数作用域的id?


所有回复都是一样的:你不能这样做,你必须重命名其中一个。 - Ruan Mendes
4个回答

17

很遗憾,您不能这样做。通过在嵌套函数中命名参数为id,您已经隐藏了外部函数中的参数。Javascript没有访问被隐藏名称的功能。唯一的选择是为其中一个变量选择不同的名称。


2

没有,从函数内部来看,除了在Mozilla的代码或者ES5中有一些奇怪的情况,没有任何显式的方式可以将作用域指定为上下文,并且也没有任何直接的方式可以向上爬取词法作用域链。

不过,这是一个好问题。


1
var someFunction = function(id) {
  //do some stuff
  var oid = id;
  var modifyId = function(id) {
     //do some stuff
     // you can access the outer id via the oid variable
  }
}

是的,你应该只是重命名一个形式参数。


起初我以为这个可以工作,但如果id是一个原始类型的话就不行了。从内部函数设置oid =“BLAH”将不会改变id的值。如果它是一个对象,那么id和oid都将指向同一个对象,这几乎是你想要的效果(你仍然不能通过调用oid = {a:1}来更改id指向的对象)。 - Ruan Mendes
@Juan 是的。由于id是一个字符串(我假设),这意味着我的解决方法在这种情况下几乎没有用处。因此,唯一的解决方案是避免在嵌套函数中使用相同名称的形式参数。 - Šime Vidas

1

为什么你不能只是重命名其中一个变量呢?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接