閉包作用域
O_o不想說話發表於2020-04-04
閉包作用域詳解
- 閉包就是函式執行形成私有上下文,保護裡面的變數不受外界影響,也可以理解為函式執行形成不銷燬的私有上下文,保護裡面的變數不受外界的影響
- 建立函式
- 開闢一個堆記憶體
- 把函式體中的程式碼字串的形式儲存到堆記憶體中
- 把堆記憶體地址賦值給函式名或者變數名(賦值操作永遠是把右邊的結果賦值給左邊)
- 給當前函式設定作用域[[scope]] = 當前函式建立時所在的上下文
- 函式執行
- 形成一個私有執行上下文
- 進棧(即形成的私有上下文進入ECStack(執行環境棧)執行,把上一個執行上下文放到ECStack底部)
- 初始化作用域鏈(scopeChain)
- 初始化this指向
- 形參變數賦值
- 變數提升
- 程式碼指向
- 程式碼指向完成可能出棧銷燬,也可能保留(這是關於垃圾回收機制的稍後在描述)
- 關於記憶體釋放問題
- 定時銷燬機制:谷歌瀏覽器每間隔一段時間就會檢視堆記憶體的空間地址引用情況,沒有被引用的就會回收銷燬
- 計數銷燬機制:火狐IE會檢視當前堆記憶體地址有多少個變數等佔用,如果佔用數量為0,就會銷燬當前堆記憶體
- 全域性執行上下文只有關閉頁面才會銷燬
- 私有執行上下文,看裡面的內容一般是空間地址,是否被私有上下文之外的東西佔用,如果有則不銷燬,如果沒有則銷燬
- 閉包有兩大作用
- 保護:即保護裡面的私有變數不受外界影響
- 儲存:即會把私有變數對於的私有資訊儲存下來