我在下面的代码中出了点问题。我无法理解它有什么问题。
function some(){
for (var i=0;i<....;i++)
{
var oneObject;
...some logic where this object is set
oneObject.watch(property,function(id, oldval, newval){
globalFunction(oneObject,id,newval);
return newval;
});
}
}
如果我有三个循环并设置三个不同的对象,我会得到以下结果。设置了三个不同的对象(例如oneObject can be equal some={},some.foo={}, some.boo={}
)。他们每个人都有自己的监视处理程序(我更改对象并调用处理程序)。问题是当调用globalFunction时,作为参数传递的oneObject总是等于for循环的最后一个对象。
我无法理解为什么会发生这种情况,因为每个新周期我都使用var重新声明oneObject变量。请解释一下。
修改
我也试过了:
function some(){
for (var i=0;i<....;i++)
{
var oneObject;
...some logic where this object is set
oneObject.watch(property,function(id, oldval, newval){
(function(obj) {
globalFunction(obj,id,newval);
}(oneObject))
return newval;
});
}
}
答案 0 :(得分:2)
由于oneObject
引用了一个对象,因此更改它也会更改对该对象的其他引用。你可以用一个闭包解决这个问题。
(function(obj) {
globalFunction(obj,id,newval);
}(oneObject))
这样,每次拨打 globalFunction
时,都会收到oneObject
的唯一副本。
您需要为oneObject
的整个引用创建一个闭包:
(function(obj) {
obj.watch(property,function(id, oldval, newval){
globalFunction(obj,id,newval);
return newval;
});
}(oneObject));
(我很好奇return
在回调中应该做些什么,但这是一个单独的问题。)
答案 1 :(得分:0)
从您提供的抽象代码中判断一下有点困难,但这看起来像是使用异步事件循环回调(即watch
中的函数)引起的问题。在这种情况下通常会发生什么:主循环设置回调。值会更改,触发正在收听的事件(即watch
)。回调在事件循环中排队,这与主执行循环不同。在下一个打开周期之前,回调不会被触发,这可能意味着主循环在此期间一直在执行,更改值。
这里有点难以解释,但这里有一个精彩视频的链接,可以引导您了解可能发生的事情的详细信息:https://www.youtube.com/watch?v=8aGhZQkoFbQ
答案 2 :(得分:0)
我认为oneObject不在范围之外。您可以尝试使用oneObjects数组,以便每次迭代都不会重新分配oneObject变量。在for循环中声明变量往往是不稳定的。