之前从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
的过程可以理解为预解释?
相关分类