当前位置:  开发笔记 > 编程语言 > 正文

函数参数

如何解决《函数参数》经验,为你挑选了2个好方法。

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



1> Andrey Fedor..:

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



2> TheHippo..:

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

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);

推荐阅读
oDavid_仔o_880
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有