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