栈:存储变量名和基本数据类型,如果变量是存复杂数据类型,在栈里面就存的是堆的地址
堆:存储复杂数据类型
执行上下文
execution context (EC)
功能:函数执行前的准备工作 当前环境下,变量的取值
分类
1、全局上下文
打开一个窗口就会创建一个全局上下文(关闭即销毁)
2、局部上下文
调用函数时就会创建一个局部上下文(函数执行完即销毁)执行的前一刻创建
3、eval上下文
eval(`let i = 0;console.log(i)`)//0 单独创建一个空间
变量提升:var申明的变量(除函数内),只提升变量的申明
函数提升:提升整个函数体 而只有字面量申明才有函数提升,提升整个函数体
函数提升优先级高于变量提升,且不会被同名变量声明时覆盖,但是会被变量赋值后覆盖
全局执行上下文
1.全局对象window GO
2.变量、函数提升
3.执行代码
局部执行上下文
1.创建(函数执行的前一刻)局部对象 AO Active Object
2.预编译
a>形参 变量提升
a>形参 变量赋值un
c>形参和实参相统一
d>函数提升
e>确定this的指向(由调用者确定)
f>确定作用域(词法环境,在哪里申明,就确定在哪里)
g>初始化作用域链
3.执行函数体代码
只赋值没有关键词 会在执行的时候在补var ,并提升成全局变量
执行上下文的生命周期:
1.创建 (变量和函数的提升)
2.执行 执行函数体的代码,会改变当前变量和全局变量的值
执行栈:存放执行上下文(最底下是GO,最上面是正在调用的函数
注:FILO(First in lastout)、进栈(压栈)、出栈
3.销毁
执行上下文和作用域的区别
作用域是静态的,执行上下文是动态的,函数不调用就不会有局部执行上下文
作用域链 Scope Chain
是内部上下文所有变量对象(包括父变量对象)的列表,决定当前变量如何取值
var i = 1;
function f70(){
console.log(i);//报错先声明后使用
let i = 0;//暂时性死区
//告知当前AO拥有该变量
}
f70()
var i = 1;
function f70(){
console.log(i); //i在申明的地方找
}
function f71(){
var i = 10
f70();//1
}
f71()