先明确什么是执行上下文可以把它理解成函数运行的专属 “工作空间”。 每次调用函数JS 引擎都会给这个函数单独开一个 “房间”房间里有变量对象、作用域链、this函数在这个房间里运行运行结束房间销毁一、创建阶段最核心调用函数立刻执行时机函数被调用 → 代码一行一行执行之前核心任务三件事只定义、不赋值1. 生成变量对象Variable Object变量对象是存放当前上下文所有变量 / 函数的容器分三步收集函数的形参→ 赋值为undefined扫描函数声明→直接把函数体赋值进去函数提升扫描变量声明→ 只声明赋值为undefined变量提升重点函数声明优先级 变量声明2. 确定作用域链Scope Chain作用域链 当前变量对象 所有父级执行上下文的变量对象作用保证变量、函数的有序访问先找自己找不到往上找3. 绑定 this根据调用方式确定 this 指向普通函数调用 →window/global对象方法调用 → 该对象构造函数 → 实例对象箭头函数 → 继承外层 this二、执行阶段代码逐行运行时机创建阶段完成后核心任务把变量对象变成活动对象逐行执行代码赋值、运算、调用函数执行完毕 → 上下文销毁三、总结创建阶段搭架子 → 变量undefined、函数就绪、作用域链 this 确定执行阶段跑代码 → 变量赋值、函数执行顺序永远是先创建后执行
JS 底层探究--执行上下文
先明确什么是执行上下文可以把它理解成函数运行的专属 “工作空间”。 每次调用函数JS 引擎都会给这个函数单独开一个 “房间”房间里有变量对象、作用域链、this函数在这个房间里运行运行结束房间销毁一、创建阶段最核心调用函数立刻执行时机函数被调用 → 代码一行一行执行之前核心任务三件事只定义、不赋值1. 生成变量对象Variable Object变量对象是存放当前上下文所有变量 / 函数的容器分三步收集函数的形参→ 赋值为undefined扫描函数声明→直接把函数体赋值进去函数提升扫描变量声明→ 只声明赋值为undefined变量提升重点函数声明优先级 变量声明2. 确定作用域链Scope Chain作用域链 当前变量对象 所有父级执行上下文的变量对象作用保证变量、函数的有序访问先找自己找不到往上找3. 绑定 this根据调用方式确定 this 指向普通函数调用 →window/global对象方法调用 → 该对象构造函数 → 实例对象箭头函数 → 继承外层 this二、执行阶段代码逐行运行时机创建阶段完成后核心任务把变量对象变成活动对象逐行执行代码赋值、运算、调用函数执行完毕 → 上下文销毁三、总结创建阶段搭架子 → 变量undefined、函数就绪、作用域链 this 确定执行阶段跑代码 → 变量赋值、函数执行顺序永远是先创建后执行