閉包作用域

O_o不想說話發表於2020-04-04

閉包作用域詳解

  • 閉包就是函式執行形成私有上下文,保護裡面的變數不受外界影響,也可以理解為函式執行形成不銷燬的私有上下文,保護裡面的變數不受外界的影響

  • 建立函式
    1. 開闢一個堆記憶體
    2. 把函式體中的程式碼字串的形式儲存到堆記憶體中
    3. 把堆記憶體地址賦值給函式名或者變數名(賦值操作永遠是把右邊的結果賦值給左邊)
    4. 給當前函式設定作用域[[scope]] = 當前函式建立時所在的上下文
  • 函式執行
    1. 形成一個私有執行上下文
    2. 進棧(即形成的私有上下文進入ECStack(執行環境棧)執行,把上一個執行上下文放到ECStack底部)
    3. 初始化作用域鏈(scopeChain)
    4. 初始化this指向
    5. 形參變數賦值
    6. 變數提升
    7. 程式碼指向
    8. 程式碼指向完成可能出棧銷燬,也可能保留(這是關於垃圾回收機制的稍後在描述)

  • 關於記憶體釋放問題
    • 堆記憶體的釋放有兩種機制
    1. 定時銷燬機制:谷歌瀏覽器每間隔一段時間就會檢視堆記憶體的空間地址引用情況,沒有被引用的就會回收銷燬
    2. 計數銷燬機制:火狐IE會檢視當前堆記憶體地址有多少個變數等佔用,如果佔用數量為0,就會銷燬當前堆記憶體
    • 執行上下文的釋放
    1. 全域性執行上下文只有關閉頁面才會銷燬
    2. 私有執行上下文,看裡面的內容一般是空間地址,是否被私有上下文之外的東西佔用,如果有則不銷燬,如果沒有則銷燬

  • 閉包有兩大作用
    1. 保護:即保護裡面的私有變數不受外界影響
    2. 儲存:即會把私有變數對於的私有資訊儲存下來

相關文章