关于范围:JavaScript,当变量作为参数传递时,更改函数内部的变量值

JavaScript, changing a variables value inside of a function when the variable is passed as a parameter

本问题已经有最佳答案,请猛点这里访问。

为什么这个不起作用,还有什么办法让它起作用?

我很肯定它不会工作,因为JavaScript中的变量作用域,但是我想不出任何方法来让它工作。

代码

1
2
3
4
var x = 5;
var z = function(y) { y = 10; };
z(x);
console.log(x) // Outputs 5 instead of 10


1
2
3
var x = 5
var z = function(y) { y = 10; }
console.log(x) // Outputs 5 instead of 10

你到底在哪里换了X?你没有x,也没有调用函数。

我假设您希望这样做:

1
2
3
4
var x = {x: 5}
var z = function(y) { y.x = 10; }
z(x);
console.log(x.x) // Outputs 10

代码在对象上使用x作为变量,而不是通过值传递而不是通过引用传递的基元数,因此无法修改。

使用对象可以修改对象的属性(属性)


X不会因为几个原因而改变。首先,您要修改函数内部的参数y。如果您传递了一个对象,这将像那些通过引用传递一样工作。如果您直接更改x而不是将其作为参数传递,它也会起作用。

第二个原因是您从未运行该函数。你需要打电话给Z和z()


1
2
3
4
5
6
7
8
var x = 5;
var z = function(y)
 {
 y = 10;
 //assigned value 10 to the function parameter variable y.
//You haven't done x=y or x=10 and so how do you expect the value of x to change?
}
 console.log(x) // Outputs 5 instead of 10

把它改成:

1
2
3
4
5
6
var x = 5 ;
var z = function(y)
 {
 x = 10; //changed value of x to 10
}
 console.log(x) // Outputs 10

这个问题根本与可变范围无关。变量x是全局变量,因为它在函数之外。是的,你可以在函数中改变它的值,但是你的代码的问题是你从来没有改变过x的值。

如果您打算这样做:

1
2
3
4
5
6
7
8
9
z(x); //x=5 is passed to the function z
 function(y)
 {  
  y=10; //initially the value of y is 5.Since you have passed x.
  //Doing y=10 does not change the value of x because y is another variable.The value of x was copied to y and y is not x.

  x=y;//You have assigned 10 to x
  }
 console.log(x); //outputs 10

更改函数参数的值不会更改传递给函数的变量的值。实际上,传递的是x到y的值,即传递的是5到y,而不是变量本身。

您没有传递变量引用。您只是传递值。


当您调用函数z时,会发生的情况是参数被初始化并分配了您传入的值。

所以函数可能读到

1
2
var y = 5;
y = 10;

所以,在函数的作用域之外的y保持不变,因为这个y实际上是一个全新的y变量,只适用于函数的作用域。