关于js执行上下文里代码的运行步骤(纯理论)

220 阅读3分钟

执行上下文(Execution Context)简称EC,指当前代码的执行环境

 包含三种环境: 1.全局环境 js代码运行起来首先进入这个环境 2.函数环境 当函数被调用时,进入这个环境 3.eval环境 这个不建议用,有很大的隐患 

 执行顺序

 当代码在执行过程中,遇到以上三种情况,都会生成一个执行上下文,放入执行上下文栈(简称ECS,也叫函数调用栈call stack)中,这个ECS会按照栈的存取方式去处理执行上下文,先进后出,后进先出.每个上下文执行完后,就会自动出栈并且被垃圾回收机制给回收(正常情况下)闭包除外 

执行上下文里函数环境代码的运行步骤 

一.创建对象(这个阶段发生在执行具体代码前)

1.创建变量对象(Variable Object)

①初始化arguments对象 它的值为Arguments对象

注意:只有执行上下文为函数环境的时候,才会初始化这个arguments对象 

②查找当前上下文的形参

 1.找所有的形参并在变量对象里创建一条key:value 

 2.key为形参的名字,value为对应实参的值.如果没有实参value为undefined  

③查找当前上下文的函数声明(function)

 1.找function声明的函数并在变量对象里创建一条key:value 

 2.key为function后的名字,value为函数在内存里的地址(堆内存地址) 

 3.如果有同名的key,后面会把前面的覆盖 

④查找当前上下文的变量声明(var)

 1.找var声明的变量并在变量对象里创建一条key:value

 2.key为变量名,value为undefined 

 3.如果key已经存在,直接跳过(为了防止这个key为函数,那函数会被修改成undefined) 注意:这个库为什么不去查找不用var声明的变量(~~var~~ a=10),不用var声明的变量严格来讲不叫变量,而是全局对象身上的属性 

 2.建立作用域链

3.确定this的指向

二.代码执行阶段

1.变量赋值 

 2.函数引用

 3.执行其他代码

 注意:当走到这个阶段,上面的变量对象会变成活动对象(Active Object)

  执行上下文里全局环境代码的运行步骤 

一.创建对象(这个阶段发生在执行具体代码前)

1.创建变量对象(Variable Object)

①初始化内置对象如(Date,Math,String...)

②查找当前上下文的函数声明(function)

 1.找function声明的函数并在变量对象里创建一条key:value 

 2.key为function后的名字,value为函数在内存里的地址(堆内存地址) 

 3.如果有同名的key,后面会把前面的覆盖 

④查找当前上下文的变量声明(var)

 1.找var声明的变量并在变量对象里创建一条key:value 

 2.key为变量名,value为undefined 

 3.如果key已经存在,直接跳过(为了防止这个key为函数,那函数会被修改成undefined) 注意:这个库为什么不去查找不用var声明的变量(~~var~~ a=10),不用var声明的变量严格来讲不叫变量,而是全局对象身上的属性

2.建立作用域链

 3.确定this的指向

 二.代码执行阶段

1.变量赋值 

 2.函数引用 

 3.执行其他代码 注意:当走到这个阶段,上面的变量对象会变成活动对象(Active Object)