在JS中,一个对象只要没有被引用那么就会被回收,比如你定义了一个对象var obj = {x: 1};但是这个对象没有在任何地方被使用,那么它就会被GC掉,假设有另一个变量var obj2 = obj2引用了,但是obj2仍然没有被使用,它们都会被GC。所以你说的vm设为null这个操作是不必要的,这里的vm只是this的一个别名,只要应用的其他地方没有对this实例的引用,那么实例就会被回收。所以才会有源码中一系列的解除关系的操作比如:remove(parent.$children, vm),父组件持有子组件的实例引用,这里就是将自己从父组件的children数组中清除,其他操作同理,都是在清除一些引用关系,比如vnode、watcher、event listener。。。这些才是真正的清除,vm = null这个无关痛痒,vm不过是函数内部的一个变量,只要函数执行完这个变量的引用关系就会解除了。
在JS中,一个对象只要没有被引用那么就会被回收,比如你定义了一个对象
var obj = {x: 1}
;但是这个对象没有在任何地方被使用,那么它就会被GC掉,假设有另一个变量var obj2 = obj2
引用了,但是obj2仍然没有被使用,它们都会被GC。所以你说的vm设为null这个操作是不必要的,这里的vm只是this的一个别名,只要应用的其他地方没有对this实例的引用,那么实例就会被回收。所以才会有源码中一系列的解除关系的操作比如:remove(parent.$children, vm)
,父组件持有子组件的实例引用,这里就是将自己从父组件的children数组中清除,其他操作同理,都是在清除一些引用关系,比如vnode、watcher、event listener。。。这些才是真正的清除,vm = null
这个无关痛痒,vm不过是函数内部的一个变量,只要函数执行完这个变量的引用关系就会解除了。