$emit(methodName, params)和v-on是紧密联系的,调用$emit的是子组件的vm实例,结果是调用了父组件对应的方法,那么这个是怎么做到的呢?
在父组件的创新周期中生成父组件的虚拟节点的过程的时候,会递归生成子组件的虚拟节点。而生成子组件的虚拟节点的时候会把父组件中
写在子组件节点上的 v-on 数据(key是上面$emit中的methodName,value是父组件vm中的对应的方法引用method)传递给子组件,
放在VNode的parentListener属性中,在子组件的创建的时候,initEvents方法中,调用updateComponentListeners方法,放到
子组件Vue实例vm._events数组中,而$emit方法也就是去vm._events数组中找到method然后调用。
而之所以method的调用者一直都是父组件vm的实例,是因为在父组件生成虚拟节点之前,已经调用了initMethod方法,
里面调用了method.bind(父vm实例)。