function Foo(f) {
var f = f;
}
Run Code Online (Sandbox Code Playgroud)
在函数内部,变量f是本地的Foo(它有一个函数作用域),但为什么f参数列表中的变量没有冲突?也许是因为它被束缚在Foo.arguments对象里面?
在其他语言中,我们不能声明与局部变量同名的参数变量.
这个名称歧义如何解决?或者,如何f在方法中稍后引用两个不同变量中的每一个?
And*_*rov 12
JavaScript做了一些显然不直观的事情 - 你感兴趣的事情被称为"提升" - JS将var声明移动到函数的顶部,它们的唯一目的是将此变量名称保留为函数范围内的局部变量.有时,这会导致很多奇怪.如果变量名已经被保留为局部变量(例如它是一个参数),那么var声明将被完全删除.
JS的另一个不直观的部分是它如何处理参数变量和arguments对象(这有点特殊,正如Hippo所示).但这并不一定是你感兴趣的 - 对你的例子来说重要的是参数还声明变量名称是函数的本地名称.
所有这一切的结果是,当你有一个var f和一个参数名称时f,`var f'被删除,你的例子相当于:
function Foo(f) {
f = f;
}
Run Code Online (Sandbox Code Playgroud)
您可以在Hippo的示例中看到这一点,因为:
function foo(f) {
console.log(f); // --> 11
console.log(arguments); // --> array [11]
var f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}
Run Code Online (Sandbox Code Playgroud)
相当于:
function foo(f) {
var f;
console.log(f); // --> 11
console.log(arguments); // --> array [11]
f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}
Run Code Online (Sandbox Code Playgroud)
相当于:
function foo(f) {
console.log(f); // --> 11
console.log(arguments); // --> array [11]
f = 10;
console.log(f); // --> 10
console.log(arguments); // --> [10] (!!!)
}
Run Code Online (Sandbox Code Playgroud)
有关更多详细信息,请参阅JS规范ECMA-262中的第10.1.3节- 变量实例化(第37页底部).
除了重命名其中一个或将值存储在另一个变量中之外,无法解决此问题.
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);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2226 次 |
| 最近记录: |