$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实例)。