JS参考内部功能和手表

时间:2014-12-16 23:44:58

标签: javascript watch

我在下面的代码中出了点问题。我无法理解它有什么问题。

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;
   });
 }
}

3 个答案:

答案 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循环中声明变量往往是不稳定的。