Vue源碼解析(1)

Dep和watcher的關係

  • 什麼關係?web

    多對多數組

  • 如何創建的?微信

    data中徐行的get()中創建關係,dep.subs watcher.depIdsapp

  • 何時創建?svg

    初始化,解析模板中的表達式時 ,new Watcher對象時創建;函數

Array.apply(null, { length: 20 }).map(function () {
	return createElement('p', 'hi')
})

apply函數不是接受數組的嗎?爲何能夠接受對象;帶着好奇我查了下文檔,原來從es5開始早已規定,apply接受數組或者類數組,就是說只要有一個 length 屬性和(0..length-1)範圍的整數屬性。例如如今能夠使用 NodeList 或一個本身定義的相似 {'length': 2, '0': 'eat', '1': 'bananas'} 形式的對象。es5

那爲何要用apply,不直接new Array(5)?我試了下spa

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-iGHgrXCB-1593681635965)(C:\Users\18070121\Desktop\微信截圖_20200701151104.png)]pwa

Array(5).map返回仍是{length: 5}的空數組對象,而Array.apply(null,{length:4})就能返回四個已經初始化的數組;這也就是爲何能夠map遍歷的緣由;
那麼既然apply能夠,那跟他一樣功能的call函數可不能夠呢?
下面是我試的結果;code

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-BaqT4OvP-1593681635968)(C:\Users\18070121\Desktop\微信截圖_20200701151831.png)]

…(img-BaqT4OvP-1593681635968)]

結果是不能夠的,Array.call(null,{length:4})生成了一個下標爲0,值爲{length:4}的空數組,跟new Array(4) 結果同樣;因而可知只有apply的{length:4}的傳參方式纔會建立一個初始化下標的數組;若是你非要用call,那就只能這樣啦 Array.call(null,undefined,undefined,undefined);