JavaScript,当变量作为参数传递时,更改函数内部的变量值

时间:2015-12-21 23:42:53

标签: javascript scope

为什么这不起作用,有没有办法让它发挥作用?

我很确定它不起作用因为javascript中的变量作用域,但我想不出任何方法让它工作。

代码

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

4 个答案:

答案 0 :(得分:1)

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

第二个原因是你从未运行过该功能。您需要使用z()

调用z

答案 1 :(得分:1)

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

你究竟在哪里改变了X?你没有X而你也没有调用这个函数。

我假设您希望这样做:

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

代码使用x作为对象的变量而不是原始数字,它通过值传递而不是通过引用传递,因此无法修改。

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

答案 2 :(得分:0)

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

因此该函数可能会读取类似

的内容
var y = 5;
y = 10;

因此,函数外部范围内的y保持不变,因为这个y实际上是一个全新的y变量,仅适用于此函数的范围。

答案 3 :(得分:0)

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

将其更改为:

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

该问题与可变范围无关。您的变量x是全局的,因为它在函数之外。 是的,您可以在函数内部更改它的值。但是代码的问题在于您从未更改过x的值。

如果您打算这样做:

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而不是变量本身。

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