對Google V8的一點理解

背景

  1. 哪裏需要JavaScript,哪裏就有v8
  2. 解析JavaScript的工具
  3. 函數調用產生閉包
  4. 任何一個函數都有一個屬性prototype,唯一,系統的Object也有
  5. 每一個函數的實例對象有一個屬性__proto__,指向其函數的prototype,然後這個對象有個constructor在指回去
  6. 函數優先級比var高

HTML文檔加載順序

  1. 創建內存結構
  2. V8讀取文檔(從上到下、從左到下),產生BOM、DOM對象,BOM的範圍大於DOM(document以下)
  3. V8初始化BOM和DOM樹對象
  4. V8創建GO對象(預加載或者提升)
  5. 執行script腳本
  6. 事件執行script腳本

瀏覽器程序的內存

  1. 棧,變量,常量池的內存的地址
  2. 堆,空間最大,有一片區域,專門用戶用來存放函數的,函數定義區,還有一片區域–函數緩存區
  3. 池(常量)

GO

  1. 預加載全局對象–window,全局作用域
  2. 第一步先創建GO對象
  3. 把全局聲明的變量和函數聲明放入到GO對象

AO

  1. 局部作用域
  2. 先創建一個AO(activation object)對象,AO{}
  3. 將函數內的所有形參和變量聲明全部放入AO對象中,值爲undefined
  4. AO對象有this和arguments內置對象
  5. 將形參和實參進行統一(分別進行初始化賦值)
  6. 將所有函數聲明存入到AO對象中,key爲函數名,整體內容作爲value

GC原理

Scopes

  1. 作用域鏈
// 第三層(GO)
function a() {
  // 第二層(AO)
  function b() { // [[Scopes]].length === 3
    // 第一層(AO)
    var bb = 234
  }
  var aa = 123
  b()
}
var glob = 100
a()
  1. 圖解
// 定義函數
function test(a, b) {
  console.log(a)
  var c = 123
  console.log(c)
  function a() {}
  console.log(b)
  var b = function c() {}
  console.log(b)
}
test(1, 3)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章