功能Foo(f)
{
var f = f;
}
{
var f = f;
}
这里里面的函数变量f是本地的Foo(它有一个函数范围)
但参数列表中的变量f以与之不同的方式命名
在冲突中可能是因为它绑定在Foo.arguments对象内?
在其他语言中,我们无法声明与局部变量具有相同名称的参数变量.
解决方法
JavaScript做了几件不明显直观的东西 – 你感兴趣的东西被称为“提升” – JS将var声明移动到一个函数的顶端,它们的唯一目的是将这个变量名称保留为函数范围内的局部变量.有时,这将导致
lots of weirdness.如果变量名已被保留为局部变量(例如,它是一个参数),则var声明将完全删除.
JS的另一个不切实际的部分是它如何处理参数变量和参数对象(这有点特别,如Hippo所示).这不一定是您感兴趣的,但是,对于您的示例来说重要的是参数也声明变量名称为函数的本地.
所有这些的结果是,当你有一个var f和一个参数名称f时,`var f’将被丢弃,你的例子相当于:
function Foo(f) { f = f; }
您可以在河马的例子中看到这一点,因为:
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] (!!!) }