JavaScript執行上下文和執行棧
執行上下文就是JavaScript代碼被解析和執行的時候所在的環境。JavaScript中全部的代碼都是在執行上下文中運行的。node
執行上下文的三種類型:
- 全局執行上下文:默認的上下文,代碼在運行時會建立一個全局對象,在瀏覽器中是window對象,this指針會指向這個全局對象。一個程序中只能存在一個全局對象。
- 函數執行上下文:每個函數在被調用的時候就會建立本身的執行上下文,每一個函數都有本身的執行上下文,只有在被調用的時候纔會建立上下文。
- Eval函數執行上下文:運行在eval函數中的代碼也會有上下文。
執行上下文的生命週期
-
建立階段算法
-
執行階段瀏覽器
-
回收階段函數
-
- 建立階段:當函數被調用可是尚未執行函數內部任何代碼的時候就屬於建立階段,在建立階段會建立變量對象,初始化函數參數,提高函數聲明和變量聲明。建立做用域鏈,做用域鏈的建立是在變量對象以後。肯定this關鍵字的指向。
-
-
- 回收階段:執行上下文出棧等待虛擬機回收執行上下文。
變量提高和this指向的細節
- 一、變量聲明提高,在JavaScript中變量能夠先使用,後聲明,這樣並不會報錯,由於在建立上下文的時候會將變量和函數的聲明提早。
- 二、函數聲明提高,
執行上下文棧
JavaScript代碼在執行的時候會建立上下文執行棧來管理執行上下文,執行上下文棧是一種存儲函數調用的棧結構,其運行過程遵循先進後出的原則。當每個函數執行的以後就會建立函數的執行上下文,而且把函數的執行上下文壓入棧的頂部,當函數執行完以後,函數的上下文出棧等待垃圾回收。全局的執行上下文只有惟一的一個,當瀏覽器關閉的時候就會出棧被垃圾回收器回收。this
寫React\Vue的項目的時候爲何要在組件中寫key,做用是什麼?
答案:key的做用是爲了在執行Diff算法的時候更快的找到對應的節點,提升Diff算法的執行效率和速度。key是給每個vnode的惟一的id,能夠依靠key更快的更準確的獲取到oldVnode中的節點。指針