函数参数

xde*_*000 9 javascript scope

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页底部).


The*_*ppo 6

除了重命名其中一个或将值存储在另一个变量中之外,无法解决此问题.

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)