如果被监视的表达式是引用类型,由于引用类型的赋值只是将被赋值变量指向当前引用,故$watch认为没有改变。所以应该根据实际情况来使用valueEq。从代码中能够看出,$watch的功能其实非常简单,就是构造watcher对象,并将watcher对象插入到scope.$$watchers数组中,然后返回一个销毁当前watcher的函数。两个函数实际上分别对应了$digest的内层循环和外层循环。示例代码第18行,watcher.last的赋值证实了上文提到的$watch的第三个参数valueEq的作用。这样做减少了遍历watcher的数量,优化了性能。$digest函数主要由do while循环体内调用$digestOnce进行脏检测 以及 对其他一些异步操作的处理组成。当TTL值为0,再进行循环就会报错。$eval使我们能够在scope的context中执行一段表达式,并允许传入locals object对当前scope context进行修改。

深入理解AngularJs-scope的脏检查(一)

深入理解AngularJs-scope的脏检查(一)

深入理解AngularJs-scope的脏检查(一)

深入理解AngularJs-scope的脏检查(一)

深入理解AngularJs-scope的脏检查(一)

深入理解AngularJs-scope的脏检查(一)

深入理解AngularJs-scope的脏检查(一)