估计有些小朋友看了我们之前的那几篇文章,还是有点云里雾里的,那么我就总结一下,具体的流程步骤,希望对大家有帮助。
首先我们要知道,以下这些过程都是js解析器所需要去做的,都是一些抽象的概念,和我们js代码中的对象不是一回事,他们在js代码中是不存在的,只是为了让我们更好的理解,模拟成js中的对象的。
1.JS引擎在进入一段可执行的代码之前就会进行以下三个步骤
a.创建一个全局对象(Global Object)
b.创建一个 执行上下文栈 (execution context)
c.创建一个 全局上下文(EC)并放入执行上下文栈中
2.进入全局上下文中
2.1创建阶段(预处理)
(在进入第一行代码以前,js引擎会把全局对象初始化给全局变量对象,因为全局对象和全局变量变量这些都是抽象的概念(他们并不存在),所以js代码是无法访问到的,但是我们想要访问他,怎么办呢?所以就让window指向全局对象,window也是全局对象的一个属性,我们在控制台看见的window无线的循环就是因为,他一直指向他本身,所以,我们可以通过window这个属性间接拿到这个全局对象(变量对象)并操作。)
a.创建一个变量对象
{
函数的所有形参(如果我们是在函数执行上下文中)
没有传递对应参数的话,那么由名称和undefined值组成的一种变量对象的属性也将被创建。
如果在函数中还会生成Arguments对象
所有函数声明(FunctionDeclaration, FD)
如果变量对象已经存在相同名称的属性,则完全替换这个属性。
所有变量声明(var, VariableDeclaration)
1.必须是var的,没有var的是不存在变量对象里面的
2.如果有同名函数不会被变量声明覆盖,会绕过去
3.给个值-underfined
4.无论是包含数组还是对象还是函数,在变量里面只是放着一个地址而已
注意,函数表示式是不会出现在变量对象中的 : 匿名函数和函数表示式
}
b.创建作用域链--装入当前执行上下文中的变量对象
(
函数有个默认属性,scope,在函数创建的的时候,这个属性就生成了,里面存在当前上下文的变量对象(什么叫函数创建的时候,当代码一行一行的解析到函数定义的时候,这个才会创建函数,函数里面包裹的函数,这个时候还没有被创建,当调用函数的时候,里面的函数才会被创建,会生成默认属性scope,这个里面会被装入父级的scope)
)
c.创建this值
2.2执行代码
从头开始一行一行执行代码,然后给变量赋值,赋值后更新变量对象中对象变量的值