JavaScript做了一些显然不直观的事情 - 你感兴趣的事情被称为"提升" - JS将var声明移动到函数的顶部,它们的唯一目的是将此变量名称保留为函数范围内的局部变量.有时,这会导致很多奇怪.如果变量名已经被保留为局部变量(例如它是一个参数),那么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页底部).
JavaScript做了一些显然不直观的事情 - 你感兴趣的事情被称为"提升" - JS将var声明移动到函数的顶部,它们的唯一目的是将此变量名称保留为函数范围内的局部变量.有时,这会导致很多奇怪.如果变量名已经被保留为局部变量(例如它是一个参数),那么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页底部).
除了重命名其中一个或将值存储在另一个变量中之外,无法解决此问题.
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);