执行上下文(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)