我在另一个函数中使用了匿名函数作为参数,而匿名函数本身也有参数。当另一个函数正在运行时,匿名函数不能正常工作。我很好,我能帮忙吗?代码如下:
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
答案 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);
调用函数时,引用值按值传递以下活动发生
x
x
,
有效x包含全局变量x的引用。x = {'x':99};
进行任何更改时,它会
只需创建一个新的对象{'x':99}
并分配新的引用
新的Object to 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
,
有效x包含全局变量x的引用。{x.x = 7;}
实际上是一种解除引用或您
正在尝试获取全局对象x
的值然后
将新值7分配给全局对象x
属性x
。你是
修改全局对象,而不是将x的引用更改为新对象
是在第一个场景中完成的。所以变化反映在整个过程中
全局对象x
。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