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

时间:2017-12-03 04:40:36

标签: javascript jquery node.js

我有一个javascript函数如下:



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

主片段将名为x的变量传递给上面的函数,如下所示:

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

预期的输出应该是&#34; 11&#34;打印10次,但它打印一次。函数调用会更改x的值,尽管我没有修改传递的值。函数中的x具有自己的范围。然而它被修改了。对此的任何帮助都将受到高度赞赏。

3 个答案:

答案 0 :(得分:2)

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

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

&#13;
&#13;
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));
}
&#13;
&#13;
&#13;

答案 1 :(得分:2)

将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作为全局变量。

答案 2 :(得分:0)

关于JavaScript中变量作用域的MDSN文档:

  

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

使用#include<stdio.h> int getnum(int num); int breaksquaresum(int num); int main() { while(1){ printf("Enter a number to check whether Happy Or Not \n"); int k; scanf("%d",&k); int indicator= breaksquaresum(k); if(indicator == 1){ printf("Number %d is Happy\n",k); } else{ printf("Number %d is Not Happy!!\n",k); } } } int breaksquaresum(int num) { printf("%d num\n",num); int sum=0,rem; while(num!=0){ rem=num%10; sum=sum+(rem*rem); printf("Sum %d\n",sum); num=num/10; } if(sum<10 && sum==1 || sum==7) return 1; if(sum<10 && sum!=1 && sum!=7 ) return 0; breaksquaresum(sum); } 关键字时,变量声明会被拉到其范围(函数)的顶部。

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

在您的函数for (var x = 0...中,您要在执行结束时将全局 modifyx设置为11。这导致外部循环只运行一次,因为在第一次循环后x不再小于10。

以下是评论内容的示例:

x

一个简单的解决方案是在两个循环中使用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