EC:
在内存中分很多区,我们要掌握的是堆区和栈区。
其中,JS代码中的基本数据类型、引用地址储存在栈区。而引用数据类型储存在堆区。
在JS代码中,一般分为两类:全局代码、局部代码。
全局代码:默认进入script标签,就会执行全局代码。
函数代码:一个函数就是一个函数代码。
重点理解:
1、全局代码在执行时,会产生全局的执行上下文,全称为 Execution Content Globle,简称ECG。
2、局部代码在执行时,也会产生执行上下文 Execution Content,简称EC。
3、执行上下文产生后,都需要放到一个栈中,这个栈被称为全局上下文栈,全称为Exectuion Content Stack,简称ECS。
4、当函数执行完毕时,函数的EC要出栈。当ECG执行完毕时,也要出栈。
5、JS在执行代码时,先执行全局代码,就会产生ECG,产生ECG后,ECG入栈。然后执行函数时,也会产生上下文(EC),EC也会入栈。
每执行一个函数,就会产生一个EC(ECfn),然后入栈。
此时栈就像一个杯子一样,先产生的先进去,后产生的后进去。
在所有上下文执行完毕后,按顺序再从栈中出来。此时就是EC先出栈,ECG最后出栈。
EC和ECG的作用:给代码提供数据。代码所需要的数据,都是从EC和ECG中去找。
GO:
JS在执行代码时,会在堆内存中创建一个全局对象:Global Object。简称GO。
在浏览器中,此时的GO就是window。
window是一个全局对象。
我们声明的全局变量以及在全局代码中写的函数,都会挂载到GO,也就是window上。
ECG:
1、代码执行前,ECG中含有一个VO(变量对象),而ECG中的VO就是GO(window)。
2、代码执行到一个函数时,会产生EC(Fn):这个EC(Fn)中首先包含一个AO(活动对象):就是函数中的形参、arguments、函数内部定义的变量等等,统称为AO。
另外在EC(Fn)中还包含另一部分:scope-chain(作用域链)。这个作用域链中包含:自身的AO以及父的VO。
第三部分是包含this绑定。