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);
调用函数时 引用的值按值传递 发生以下活动
- 创建了一个新变量
x
- 将 x 的值(在步骤 1 中创建)赋给全局变量
x
,
实际上 x 包含全局变量 x 的引用。
- 接下来,当你像
x = {'x':99};
那样对 x 进行任何更改时,它将
只需创建一个新对象 {'x':99}
并分配新的引用
x 的新对象。因此,x(第 1 步)指向一个新对象,
x 的值为 99.
- 下一行
alert(x.x);
x 指向全局对象,因为
全局对象 x 没有被修改 x.x
的值仍然是
3.
第二种情况:
go(x, function(x){x.x = 7;}); //it behaves normal, alert 7, not 3
前几个步骤相似
- 创建了一个新变量
x
- 将 x 的值(在步骤 1 中创建)赋给全局变量
x
,
实际上 x 包含全局变量 x 的引用。
- 这个语句
{x.x = 7;}
实际上是一种解引用或者你
正在尝试获取全局对象 x
的值,然后
将新值 7 分配给全局对象 x
属性 x
。你是
修改全局对象而不是将 x 的引用更改为新对象
是在第一个场景中完成的。所以变化反映在
全局对象 x
.
- 接下来,声明
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
我在另一个函数中使用了匿名函数作为参数,匿名函数本身有参数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);
调用函数时 引用的值按值传递 发生以下活动
- 创建了一个新变量
x
- 将 x 的值(在步骤 1 中创建)赋给全局变量
x
, 实际上 x 包含全局变量 x 的引用。 - 接下来,当你像
x = {'x':99};
那样对 x 进行任何更改时,它将 只需创建一个新对象{'x':99}
并分配新的引用 x 的新对象。因此,x(第 1 步)指向一个新对象, x 的值为 99. - 下一行
alert(x.x);
x 指向全局对象,因为 全局对象 x 没有被修改x.x
的值仍然是 3.
第二种情况:
go(x, function(x){x.x = 7;}); //it behaves normal, alert 7, not 3
前几个步骤相似
- 创建了一个新变量
x
- 将 x 的值(在步骤 1 中创建)赋给全局变量
x
, 实际上 x 包含全局变量 x 的引用。 - 这个语句
{x.x = 7;}
实际上是一种解引用或者你 正在尝试获取全局对象x
的值,然后 将新值 7 分配给全局对象x
属性x
。你是 修改全局对象而不是将 x 的引用更改为新对象 是在第一个场景中完成的。所以变化反映在 全局对象x
. - 接下来,声明
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