代码分为两类
函数外面的代码叫全局代码
一个函数就是一个局部代码
执行上下文(Execute Context)简称EC
EC的作用:
给代码提供数据
执行上下文的类型
全局代码在执行时,会产生全局的EC
简称EC(G)
- 一个程序中只会有一个全局执行上下文
- 函数代码在执行时,会产生局部的EC。
- 调用一个函数就会产生一个EC
- 其执行顺序为先进后出
栈
基本数据类型,数据存储在栈区
堆
引用数据类型,数据存储在堆中
EC栈
- 每产生一个EC就会放到栈中
- 先放进去的后出来
执行上下文栈
全局执行上下文
- 存储全局的加var 加function的数据存储在VO中
变量对象
- 存储的全局的加var 或 加function
函数执行上下文
- 存储局部的加var 或 加funciton的局部数据
活动对象
- 存储局部的加var 或 加function的局部数据
全局对象
- 默认情况下,里面存储很多东西
- 全局的数据,加Var的全局数据,加functon的全局数据,不加var的变量都会存储到GO中
闭包
一个不能被释放的栈空间
作用域链
描述找数据的链,先在自己的EC中找,如果找不到数据,就去自己的父EC中找,如果还是找不到,就去父EC的父EC中找,直到找到EC(G),如果还找不到就报错。数据的查找机制。
JS代码执行分两个阶段
提升:
- 全局代码中: 提升到代码段最前面
加var的全局变量 仅仅提升是声明
加function的全局函数 提升的是定义 定义 = 声明+赋值
- 函数内部:
加var的也会提升,提升到函数体的最前面
代码执行才会产生EC。
例子:
var arr = [11,22];
function f(ary){
console.log(ary);
ary[0]=100;
ary=[666];
ary[0]=0;
console.log(ary);
}
f(arr);
console.log(arr)
(1)首先创建一个ECStack
(2)创建EC(G)
(3)创建VO
- VO中存储arr 和 f
- arr为[11,22],f为一个函数地址f{…}
- [11,22],f{…}在不同的堆中
- 此时,arr,f也会存储在GO中
(4)创建EC(f)
(5)创建AO
- 在AO中逐步进行形参赋值,提升,代码执行
- 函数调用完毕,EC(f)出栈,EC(f)销毁,外界不能访问
(6)代码执行结束