javascript传入的匿名函数不改变参数值

javascript the passed anonymous function does not change value of parameters

我在另一个函数中使用了匿名函数作为参数,匿名函数本身有参数also.When另一个函数是运行,匿名函数没有像我那样工作expected.I 被骗了,你能帮忙吗?代码如下:

function go(x, func){
  func(x);
  alert(x.x);
}

var x = {'x': 3};
go(x, function(x){x = {'x':99};});//actually it alert 3, not 99, x not change
go(x, function(x){x.x = 7;}); //it behaves normal, alert 7, not 3

x 是多少?
var x = {'x': 3};

x 是变量,它是对对象实际值的引用。

第一个场景:
go(x, function(x){x = {'x':99};});//actually it alert 3, not 99, x not change

当使用 func(x); 调用函数时 引用的值按值传递 发生以下活动

  1. 创建了一个新变量x
  2. 将 x 的值(在步骤 1 中创建)赋给全局变量 x, 实际上 x 包含全局变量 x 的引用。
  3. 接下来,当你像 x = {'x':99}; 那样对 x 进行任何更改时,它将 只需创建一个新对象 {'x':99} 并分配新的引用 x 的新对象。因此,x(第 1 步)指向一个新对象, x 的值为 99.
  4. 下一行 alert(x.x); x 指向全局对象,因为 全局对象 x 没有被修改 x.x 的值仍然是 3.

第二种情况:
go(x, function(x){x.x = 7;}); //it behaves normal, alert 7, not 3

前几个步骤相似

  1. 创建了一个新变量x
  2. 将 x 的值(在步骤 1 中创建)赋给全局变量 x, 实际上 x 包含全局变量 x 的引用。
  3. 这个语句{x.x = 7;}实际上是一种解引用或者你 正在尝试获取全局对象 x 的值,然后 将新值 7 分配给全局对象 x 属性 x。你是 修改全局对象而不是将 x 的引用更改为新对象 是在第一个场景中完成的。所以变化反映在 全局对象 x.
  4. 接下来,声明alert(x.x);x是全局对象,but 在这种情况下 x.x (全局)的值已被修改 匿名函数。

区别在于JS如何解释代码 x = { x: 99}x.x = 7 第一段代码表示你创建了全新的匿名对象{x: 99},然后将全局变量x的引用改为这个对象。同时 第二个代码 只是获取对全局变量 x 的引用并将其更改为 属性。就是这样:)

解释见上面的答案。这是对您的问题的修复:

function go(x, func){
  x=func(x)||x;
   alert(x.x);
 }

var x = {'x': 3};
go(x, function(x){return {'x':99};});//works now
go(x, function(x){x.x = 7;}); //it behaves normal, alert 7, not 3