JavaScript执行上下文||变量提升

栈:存储变量名和基本数据类型,如果变量是存复杂数据类型,在栈里面就存的是堆的地址
堆:存储复杂数据类型

执行上下文
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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值