首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函数参数

函数参数
EN

Stack Overflow用户
提问于 2009-03-19 15:29:01
回答 5查看 2.3K关注 0票数 9
代码语言:javascript
复制
function Foo(f) {
   var f = f;    
}

在函数内部,变量fFoo的局部变量(它有一个函数作用域),但是为什么参数列表中的变量f没有冲突呢?也许是因为它被绑定在Foo.arguments对象中?

在其他语言中,我们不能声明与局部变量同名的参数变量。

如何解决此名称歧义问题?或者,如何在稍后的方法中引用两个不同的f变量?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2009-03-19 16:16:05

JavaScript做了几件明显不直观的事情--您感兴趣的事情叫做“提升”-- JS将var声明移动到函数的顶部,在那里它们的唯一目的是将这个变量名保留为函数作用域中的一个局部变量。有时,这会导致lots of weirdness。如果变量名已保留为局部变量(例如,它是一个参数),则var声明将被完全删除。

JS的另一个不直观的部分是它如何处理参数变量和arguments对象(正如Hippo所示,它们有点特殊)。不过,这并不一定是您感兴趣的内容--对于您的示例来说,重要的是参数还将该变量名声明为函数的局部变量。

所有这些的结果是,当您有一个var f和一个参数名称f时,‘`var f’将被删除,并且您的示例等同于:

代码语言:javascript
复制
function Foo(f) {
   f = f;
}

您可以在Hippo的示例中看到这一点,因为:

代码语言:javascript
复制
function foo(f) {
    console.log(f); // --> 11
    console.log(arguments); // --> array [11]
    var f = 10;
    console.log(f); // --> 10
    console.log(arguments); // --> [10] (!!!)
}

等同于:

代码语言:javascript
复制
function foo(f) {
    var f;
    console.log(f); // --> 11
    console.log(arguments); // --> array [11]
    f = 10;
    console.log(f); // --> 10
    console.log(arguments); // --> [10] (!!!)
}

等同于:

代码语言:javascript
复制
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页底部)。

票数 12
EN

Stack Overflow用户

发布于 2009-03-19 15:43:32

除了重命名其中一个变量,或者将值存储在另一个变量中之外,没有其他方法可以解决这个问题。

代码语言:javascript
复制
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);
票数 6
EN

Stack Overflow用户

发布于 2009-03-19 15:36:47

一旦你声明了一个与旧变量同名的新变量,它就会覆盖它,并且你不能同时引用这两个变量。

您应该更改参数或变量名。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/662649

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档