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和
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变量,只适用于函数的作用域。