watch.js疯了

时间:2013-09-02 14:13:20

标签: javascript object

使用watch.js的浏览器端版本。

在html头中:

<script type="text/javascript" src="S/watch.js"></script>

在javascript中:

var here={'now':'somewhere'}

watch(here,['now'],function(){
  console.log('home changed: '+here.now);
  });

here.now='somewhere else';

我一遍又一遍地循环这个错误:

未捕获的TypeError:无法读取未定义的属性“未定义” watch.js:345

错误显示来自此处 - watch.js代码:

var loop = function(){

        for(var i in lengthsubjects){

            var subj = lengthsubjects[i];
            var difference = getObjDiff(subj.obj[subj.prop], subj.actual);   <-watch.js:345

为什么会这样?

更新

即使我什么都没看,只是将脚本添加到头部,它仍会无限地发生同样的错误

1 个答案:

答案 0 :(得分:0)

FIXED!

在循环函数中包装此

中的所有内容
if(lengthsubjects.length!==0){}

因为如果你做console.dir(lengthsubjects);

你得到:

length: 0,
__proto__: Array[0]

这是watch.js从340-360行的变化:

var loop = function(){
    if(lengthsubjects.length!==0){
    for(var i in lengthsubjects){
        //
        var subj = lengthsubjects[i];
        var difference = getObjDiff(subj.obj[subj.prop], subj.actual);

        if(difference.added.length || difference.removed.length){
            if(difference.added.length){
                for(var j in subj.obj.watchers[subj.prop]){
                    watchMany(subj.obj[subj.prop], difference.added, subj.obj.watchers[subj.prop][j], subj.level - 1, true);
                }
            }

            callWatchers(subj.obj, subj.prop, "differentattr", difference, subj.actual);
        }
        subj.actual = clone(subj.obj[subj.prop]);

    }

    }
};