1. /* @flow */
    2. import { _Set as Set, isObject } from '../util/index'
    3. import type { SimpleSet } from '../util/index'
    4. import VNode from '../vdom/vnode'
    5. const seenObjects = new Set()
    6. /**
    7. * Recursively traverse an object to evoke all converted
    8. * getters, so that every nested property inside the object
    9. * is collected as a "deep" dependency.
    10. *
    11. * 深度监听,就是watch的deep选项
    12. * 递归每一个对象或者数组,
    13. * 触发它们的getter,
    14. * 使得对象或数组的每一个成员都被依赖收集,
    15. * 形成一个“深(deep)”依赖关系
    16. */
    17. export function traverse (val: any) {
    18. _traverse(val, seenObjects)
    19. //清除对象 给对象置空
    20. seenObjects.clear()
    21. }
    22. function _traverse (val: any, seen: SimpleSet) {
    23. let i, keys
    24. const isA = Array.isArray(val)
    25. //isFrozen 方法判断一个对象是否被冻结。
    26. //val 是否是被VNode 实例化
    27. // 如果对象已经被冻结,或者是vNode,就直接返回
    28. if ((!isA && !isObject(val)) || Object.isFrozen(val) || val instanceof VNode) {
    29. return
    30. }
    31. if (val.__ob__) {
    32. const depId = val.__ob__.dep.id
    33. if (seen.has(depId)) {
    34. return
    35. }
    36. // seen 是 seenObjects = new _Set(); add 就是set对象中的add方法,添加为一的值得key
    37. //如果没有则添加进去
    38. seen.add(depId)
    39. }
    40. //如果是数组
    41. if (isA) {
    42. i = val.length
    43. //则循环检查 回调递归
    44. while (i--) _traverse(val[i], seen)
    45. } else {
    46. keys = Object.keys(val)
    47. i = keys.length
    48. //如果是对象也循环递归检查
    49. while (i--) _traverse(val[keys[i]], seen)
    50. }
    51. }