0

使用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';

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

未捕获的类型错误:无法读取未定义 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

为什么会这样?

更新

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

4

1 回答 1

0

固定的!

在循环函数中将所有内容包装在这个

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

    }

    }
};
于 2013-09-02T14:46:39.323 回答