20240310.v8學習

  • v8啟動時需要的執(zhí)行環(huán)境

    • 堆和椈疟眨空間

    • 全局執(zhí)行上下文

    • 全局作用域

    • 事件循環(huán)系統(tǒng)

    • 消息循環(huán)系統(tǒng)

    • 內(nèi)置函數(shù)

image.png

經(jīng)v8處理后生成抽象語法樹,在生成抽象語法樹的同時,會生成相關的作用域慨蓝,作用域中存放相關變量覆山。

字節(jié)碼:介于AST和機器代碼的中間代碼竹伸。

生成字節(jié)碼之后->解釋器

當一段代碼被多次重復執(zhí)行,那么監(jiān)控機器會將這段代碼標記為熱點代碼簇宽。

當某段代碼被標記為熱點代碼后勋篓,v8就會將這段字節(jié)碼丟給優(yōu)化編譯器,優(yōu)化編譯器會再后臺將字節(jié)碼編譯為二進制代碼魏割,然后再對編譯后的二進制代碼執(zhí)行優(yōu)化操作譬嚣。

var test = 'GeekTime'

執(zhí)行過程:

  • 這段代碼被解析器結(jié)構(gòu)化稱AST,生成AST同時還會生成作用域

  • 解釋器生成字節(jié)碼

  • 解釋器執(zhí)行字節(jié)碼

cpu只能識別二進制的指令钞它,將二進制轉(zhuǎn)換稱人類可以識別和記憶的符號->匯編指令集

cpu不同需要使用不同的指令集拜银,運行代碼需要編寫不同架構(gòu)的匯編代碼,編寫匯編代碼時遭垛,需要了解和處理器架構(gòu)相關的硬件知識尼桶。

高級語言,屏蔽計算機架構(gòu)細節(jié)的語言锯仪,能適應多種不同CPU架構(gòu)的語言泵督。

處理器識別高級代碼->解釋器/編譯器

  • 解釋執(zhí)行


    image.png
  • 編譯執(zhí)行


    image.png

V8采用混合編譯執(zhí)行和解釋執(zhí)行兩種手段,JTI技術(shù)庶喜。

解釋執(zhí)行:啟動速度快小腊,執(zhí)行時速度慢。

編譯執(zhí)行:啟動速度慢久窟,執(zhí)行速度快秩冈。

js中的函數(shù),是一種特殊的對象瘸羡。

V8 采用了哪些策略提升了對象屬性的訪問速度

ESMAScript規(guī)范中定義了數(shù)字屬性應該按照索引值大小升序排列漩仙,字符串屬性根據(jù)創(chuàng)建時的順序升序排列。

常規(guī)屬性:字符串屬性根據(jù)創(chuàng)建時的順序升序排列犹赖。字符串屬性常規(guī)屬性队他,被稱為properties

排序?qū)傩裕簲?shù)字屬性應該按照索引值大小升序排列。在V8中被稱為elements

var bar = new Foo()

對象包含兩個隱藏屬性elements 屬性和 properties 屬性

elements對象會按照順序存放排序?qū)傩跃澹琾roperties屬性會按照創(chuàng)建時的順序保存常規(guī)屬性麸折。

如果執(zhí)行索引操作,v8會先讀取elemenets對象中的元素粘昨,在讀取properties對象元素垢啼。

快屬性和慢屬性

讀取屬性bar.B窜锯,v8會從properties屬性所指向的對象properties然后再在 properties 對象中查找 B 屬性。

基于這個原因芭析,V8 采取了一個權(quán)衡的策略以加快查找屬性的效率锚扎,這個策略是將部分常規(guī)屬性直接存儲到對象本身,我們把這稱為對象內(nèi)屬性馁启。

image.png

采用對象內(nèi)屬性之后驾孔,常規(guī)屬性就被保存到 bar 對象本身了,這樣當再次使用bar.B來查找 B 的屬性值時惯疙,V8 就可以直接從 bar 對象本身去獲取該值就可以了翠勉,這種方式減少查找屬性值的步驟,增加了查找效率霉颠。

對象內(nèi)屬性的數(shù)量是固定的对碌,默認是 10 個,如果添加的屬性超出了對象分配的空間蒿偎,則它們將被保存在常規(guī)屬性存儲中朽们。

如果一個對象的屬性過多時,V8 就會采取另外一種存儲策略酥郭,那就是“慢屬性”策略华坦,但慢屬性的對象內(nèi)部會有獨立的非線性數(shù)據(jù)結(jié)構(gòu) (詞典) 作為屬性存儲容器。所有的屬性元信息不再是線性存儲的不从,而是直接保存在屬性字典中惜姐。

var x = 5
function foo(){
    console.log('Foo')
}

編譯階段,如果解析到函數(shù)聲明椿息,v8會將函數(shù)聲明轉(zhuǎn)換為內(nèi)存中的函數(shù)對象歹袁,并將其放到作用域中。同樣寝优,如果解析到了某個變量聲明条舔,也會將其放到作用域中,但是會將其值設置為undefined乏矾,表示該變量還未被使用孟抗。

執(zhí)行階段,如果使用了某個變量钻心,或者調(diào)用了某個函數(shù)凄硼,v8便會去作用域查找相關內(nèi)容。

立即執(zhí)行函數(shù)的兩種格式:

(function(){}())
(function(){})()


var n = 1;
(function foo(){
    n = 100;
    console.log(n);
}())
console.log(n);
//打印 100 100

作用域鏈按照函數(shù)作用域一級一級查找變量得

原型鏈是沿著對象得原型 一級一級來查找屬性得

正確設置對象得原型對象是使用構(gòu)造函數(shù)來創(chuàng)建對象捷沸。

全局作用域是在 V8 啟動過程中就創(chuàng)建了摊沉,且一直保存在內(nèi)存中不會被銷毀的,直至 V8 退出痒给。 而函數(shù)作用域是在執(zhí)行該函數(shù)時創(chuàng)建的说墨,當函數(shù)執(zhí)行結(jié)束之后骏全,函數(shù)作用域就隨之被銷毀掉了。

全局作用域:this,window,document,opener尼斧,node環(huán)境:global,file等

JavaScript 是基于詞法作用域的姜贡,詞法作用域就是指,查找作用域的順序是按照函數(shù)定義時的位置來決定得棺棵。

詞法作用域是根據(jù)函數(shù)在代碼中的位置來確定的鲁豪,作用域是在聲明函數(shù)時就確定好的了,所以我們也將詞法作用域稱為靜態(tài)作用域律秃。

只有加法會自動推導類型,其他操作會報錯治唤。

V8 會提供了一個 ToPrimitive 方法棒动,其作用是將 a 和 b 轉(zhuǎn)換為原生數(shù)據(jù)類型,

其轉(zhuǎn)換流程如下:

  • 先檢測該對象中是否存在 valueOf 方法宾添,如果有并返回了原始類型船惨,那么就使用該值進行強制類型轉(zhuǎn)換;

  • 如果 valueOf 沒有返回原始類型缕陕,那么就使用 toString 方法的返回值粱锐;

  • 如果 vauleOf 和 toString 兩個方法都不返回基本類型值,便會觸發(fā)一個 TypeError 的錯誤扛邑。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末怜浅,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蔬崩,更是在濱河造成了極大的恐慌恶座,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件沥阳,死亡現(xiàn)場離奇詭異跨琳,居然都是意外死亡,警方通過查閱死者的電腦和手機桐罕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門脉让,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人功炮,你說我怎么就攤上這事溅潜。” “怎么了死宣?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵伟恶,是天一觀的道長。 經(jīng)常有香客問我毅该,道長博秫,這世上最難降的妖魔是什么潦牛? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮挡育,結(jié)果婚禮上巴碗,老公的妹妹穿的比我還像新娘。我一直安慰自己即寒,他們只是感情好橡淆,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著母赵,像睡著了一般逸爵。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上凹嘲,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天师倔,我揣著相機與錄音,去河邊找鬼周蹭。 笑死趋艘,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的凶朗。 我是一名探鬼主播瓷胧,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棚愤!你這毒婦竟也來了搓萧?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤遇八,失蹤者是張志新(化名)和其女友劉穎矛绘,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體刃永,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡货矮,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了斯够。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片囚玫。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖读规,靈堂內(nèi)的尸體忽然破棺而出抓督,到底是詐尸還是另有隱情,我是刑警寧澤束亏,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布铃在,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏定铜。R本人自食惡果不足惜阳液,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望揣炕。 院中可真熱鬧帘皿,春花似錦、人聲如沸畸陡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丁恭。三九已至曹动,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間牲览,已是汗流浹背仁期。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留竭恬,地道東北人。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓熬的,卻偏偏與公主長得像痊硕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子押框,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容