function Foo(f) {
var f = f;
}在函数内部,变量f是Foo的局部变量(它有一个函数作用域),但是为什么参数列表中的变量f没有冲突呢?也许是因为它被绑定在Foo.arguments对象中?
在其他语言中,我们不能声明与局部变量同名的参数变量。
如何解决此名称歧义问题?或者,如何在稍后的方法中引用两个不同的f变量?
发布于 2009-03-19 16:16:05
JavaScript做了几件明显不直观的事情--您感兴趣的事情叫做“提升”-- JS将var声明移动到函数的顶部,在那里它们的唯一目的是将这个变量名保留为函数作用域中的一个局部变量。有时,这会导致lots of weirdness。如果变量名已保留为局部变量(例如,它是一个参数),则var声明将被完全删除。
JS的另一个不直观的部分是它如何处理参数变量和arguments对象(正如Hippo所示,它们有点特殊)。不过,这并不一定是您感兴趣的内容--对于您的示例来说,重要的是参数还将该变量名声明为函数的局部变量。
所有这些的结果是,当您有一个var f和一个参数名称f时,‘`var f’将被删除,并且您的示例等同于:
function Foo(f) {
f = f;
}您可以在Hippo的示例中看到这一点,因为:
function foo(f) {
console.log(f); // --> 11
console.log(arguments); // --> array [11]
var f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}等同于:
function foo(f) {
var f;
console.log(f); // --> 11
console.log(arguments); // --> array [11]
f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}等同于:
function foo(f) {
console.log(f); // --> 11
console.log(arguments); // --> array [11]
f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}有关更多详细信息,请阅读JS规范ECMA-262中的第10.1.3节-变量实例化(第37页底部)。
发布于 2009-03-19 15:43:32
除了重命名其中一个变量,或者将值存储在另一个变量中之外,没有其他方法可以解决这个问题。
function foo(f) {
console.log(f); // --> 11
console.log(arguments); // --> array [11]
var f=10;
console.log(f); // --> 10
console.log(arguments); //even this is now array [10]
}
foo(11);发布于 2009-03-19 15:36:47
一旦你声明了一个与旧变量同名的新变量,它就会覆盖它,并且你不能同时引用这两个变量。
您应该更改参数或变量名。
https://stackoverflow.com/questions/662649
复制相似问题