之前從YouDontKnowJS了解到了JS聲明會隱式‘提升’,就是大概在預解釋階段把變量聲明、函數聲明等先提到作用域的頂端聲明了然后在執行階段才執行賦值等操作,最近又從這篇文章http://davidshariff.com/blog/...深入了解了一下執行上下文的原理,大概是執行前先生成一個executionContextObj:executionContextObj = { 'scopeChain': { /* variableObject + all parent execution context's variableObject */ }, 'variableObject': { /* function arguments / parameters, inner variable and function declarations */ }, 'this': {}}先初始化作用域鏈scopeChain,然后把參數、聲明的函數和變量等等傳進variableObject:每找到一個函數聲明,就在variableObject下面用函數名建立一個屬性,屬性值就是指向該函數在內存中的地址的一個引用,如果上述函數名已經存在于variableObject下,那么對應的屬性值會被新的引用所覆蓋;接著檢查當前上下文中的變量聲明,每找到一個變量的聲明,就在variableObject下,用變量名建立一個屬性,屬性值為undefined,如果該變量名已經存在于variableObject屬性中,直接跳過(防止指向函數的屬性的值被變量屬性覆蓋為undefined),原屬性值不會被修改。最后this指向調用函數的對象。然后再開始執行,然后執行到其他函數調用時又執行一次上述過程如此類推。就是這段,特別是variableObject的傳值過程讓我覺得非常像預解釋中的提升,是否可以說這就是造成執行前聲明提升的原因,或者說創建executionContextObj的過程可以理解為預解釋?
Javascript預解釋與執行上下文Execution Context的關系
慕虎7371278
2018-09-03 12:14:24