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

时间:2017-02-15 20:06:23

标签: javascript function anonymous-function

我在另一个函数中使用了匿名函数作为参数,而匿名函数本身也有参数。当另一个函数正在运行时,匿名函数不能正常工作。我很好,我能帮忙吗?代码如下:

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

3 个答案:

答案 0 :(得分:0)

什么是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 = {'x':99};进行任何更改时,它会 只需创建一个新的对象{'x':99}并分配新的引用 新的Object to x。因此,x(步骤1)指向一个新对象, 其值为x为99。
  4. 在下一行alert(x.x); x指向全局对象,因此     未修改全局对象x,x.x的值仍然是     <强> 3 即可。
  5. 第二种情景:
    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是全局对象,但是 在这种情况下 x.x(全局)的值已被修改 匿名函数。

答案 1 :(得分:0)

不同之处在于JS如何解释代码 x = { x: 99}x.x = 7 第一个代码表示您创建全新的匿名对象{x: 99},然后将全局变量x的引用更改为此对象。同时第二个代码只是获取对全局变量x的引用并更改它的属性。那就是它:)

答案 2 :(得分:0)

有关解释,请参阅上述答案。这可以解决您的问题:

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