ECStack Excution Context Stack
执行上下文环境栈
代码执行都需要在ECStack中。栈内存,就是用来执行代码的。
EC Excution Context 执行上下文
每个域都有自己的EC。
EC创建后会被压进栈里面执行。执行完以后,如果没被其它的内容占用,那么就会出栈。如果被其它的内容占用,那么会被压入栈底,等待执行。
GO Global Object 全局对象
浏览器中GO会赋值给window。Math是全局对象。
VO Varibale Object 变量对象
全局下的变量,就是VO。
AO Activation Object 活动变量对象
函数的中变量,就是AO,可以看作是VO的分支。
变量赋值的三个步骤
1.创建变量,declair
2.创建值
1).基本值直接在栈中创建并存储。
2).引用值,引用值复杂的结构,所以特殊
需要开辟一个单独的空间储存对象中的键值对,这个空间是堆内存。每个堆内存空间都有一个可供访问的16进制地址。变量赋值时就将这个地址赋值给变量。所以,引用类型的变量存储的只是对象的堆内存地址。
3.建立变量和值的关联,赋值,defined。
创建函数和执行函数
函数创建,函数创建和一般变量创建的步骤是一样的。
函数也是对象,也是引用类型值,所以也会开辟新的堆内存空间。
函数名储存的是对应堆内存地址
所以也会创建函数名变量,创建堆内存空间,关联函数名和堆内存地址。
函数堆内存中会储存两类内容
1.函数代码字符串
2.函数对象键值对
length:形参个数
name:函数名
prototype原型
……
函数执行 fn()
函数执行会创建新的EC压进ECStack中之中。
函数执行的三个步骤:
1.初始化实参集合
arguments = {0:第一个实参,1:第二个实参,……}
2.创建形参并赋值
形参1= ……
形参2= ……
3.执行代码
形参和实参在非严格模式下会建立映射关系,某一个改变会影响另一个。
严格模式下则没有映射关系,是相互独立的。
ES6中的箭头函数是没有实参集合arguments的。