【问题标题】:How to modify a function parameter at the same time new vars are created on a loop?如何在循环上创建新变量的同时修改函数参数?
【发布时间】:2012-02-22 19:31:53
【问题描述】:

这是没有任何尝试将var nn = 99添加到循环中的代码

//note that the 'i' is a parameter of the function
function myFunction(arr, i) {
  for (i = i ? i + 5 : 1; i < arr.length; i++) {
    //...
  }
}

当我尝试添加新的 var 时,它会做我不想要的事情:

编辑:看来这是错误的

for (var nn = 99, i = i ? i + 5 : 1; i < arr.length; i++) //created a new 'i'

for (i = i ? i + 5 : 1, var nn = 99; i < arr.length; i++)
//doesn't work :(

我知道如果我把它移到外面是完全一样的。但我最讨厌的一件事是在几个月后阅读旧代码时无法理解我的意思。在循环中移动那条线会让我更容易理解那条线。

【问题讨论】:

  • 它做了什么你不想要的?
  • @Bergi 它创建了一个新的var i(我想要的是使用函数i的参数
  • 你到底想让这个循环做什么?
  • @MikeyG 循环本身,什么都没有。但我想在循环上设置一个新的var nn,同时修改函数参数的i(不创建新的var i)和循环头上的所有内容
  • 这就是为什么你应该评论棘手的代码。或者,更好的是,完全避免它。

标签: javascript function loops parameters


【解决方案1】:

您不能修改函数的参数。由于i 是一个原始值(数字),JavaScript 将按值调用,而不是按引用。

当您将第二个参数命名为“i”时,它将从一开始就可用作局部变量。在某处使用带有“i”的 var 关键字不会改变任何内容。

【讨论】:

  • "You can't modify the function's parameter" check this function myFunction(i){var i=99;return arguments[0];} will output 99. 但这也解决了我的问题,没有坏处,因为它不会创建另一个i跨度>
  • 您当然可以分配新值(通过使用名称或参数数组),但您将无法分配给引用。听起来有点像您想通过引用传递 i...
【解决方案2】:

((i = i ? i + 5 : 1) * 0) + 99

这将始终等于 99。但这并不重要,因为仍然不清楚您要完成什么。

如果您的目标是从指定的起点循环遍历数组,那么您可以这样做。

for (; i<arr.length; i++) {}

如果您不能保证 i 是一个数字,那么您将不得不执行某种检查。

for (var index=(i?i:0); index < arr.length; index++) {}

Javascript 将按值传递原语,因此您无法从该函数内部修改源值。如果需要,您可以返回修改后的值。

ivar = func(arr, ivar);
function func(arr, i){
    for (;i<arr.length; i++) {}
    return i;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 2020-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    相关资源
    最近更新 更多