繁体   English   中英

函数内部具有相同名称的变量将更改所传递参数的值

[英]Variable with same name inside function changes the value of the passed parameter

我有一个JavaScript函数,如下所示:

 function modifyx(xvalue) { val = 1; for (x = 0; x < 10; x++) { val = val + 1; } return val; } 

并且主代码片段将名为x的变量传递给上述函数,如下所示:

 for (x = 0; x < 10; x++) { console.log(modifyx(x)); } 

预期的输出应该是“ 11”打印10次,但它打印一次。 即使我没有修改传递的值,该函数调用也会更改x的值。 函数内部的x具有自己的作用域。 但是它被修改了。 任何帮助,将不胜感激。

代码中的变量xglobal 当您的方法modifyx(xvalue)第一次返回时, x的值已经是11,该值在for循环中用于第二次迭代。 因此,它无法进一步执行该方法。

for (x = 0; x < 10; x++)的声明中使用let x for (x = 0; x < 10; x++)创建一个唯一的执行环境。

 function modifyx(xvalue) { val = 1; for (x = 0; x < 10; x++) { val = val + 1; } return val; } for (let x = 0; x < 10; x++) { console.log(modifyx(x)); } 

只需将var放在for循环的两个位置

function modifyx(xvalue) {
  val = 1;
  for (var x = 0; x < 10; x++) {
    val = val + 1;
  }
  return val;
}

for (var x = 0; x < 10; x++) {
  console.log(modifyx(x));
}

因为它在代码中将x作为全局变量。

有关JavaScript中可变范围的MDSN文档:

JavaScript具有两个范围:全局和本地。 在函数定义之外声明的变量是全局变量,并且其值可在整个程序中访问和修改。 在函数定义内声明的变量是局部变量。 每次执行函数时都会创建并销毁它


当使用var关键字时,变量声明被拉到其作用域(函数)的顶部。

在示例代码中,您使用的是for循环未定义var x 当您使用for (x = 0... ,浏览器会假定您的意思for (var x = 0...因此它将创建一个名为x的全局变量。

在您的函数modifyx内部,您要在执行结束时将全局 x设置为11。 这导致外循环仅运行一次,因为x在第一个循环之后不再小于10。


这是注释发生情况的示例:

function modifyx(xvalue) {
    val = 1;
    for (x = 0; x < 10; x++) { // sets the global 'x' to 11 after loop finishes
        val = val + 1;
    }
    return val;
}

// 'x' is being defined as a global variable
for (x = 0; x < 10; x++) {
    console.log(modifyx(x)); // modifyx sets 'x' to 11
    // x is now 11, loop will now quit
}

一个简单的解决方案是在两个循环中使用let关键字,从而限制了范围。

for (let x = 0; x < 10; x++) { ... }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM