执行上下文和执行栈
什么是执行上下文?
执行上下文是当前JavaScript代码被解析和执行的一个环境。执行上下文包含了当前代码的变量和函数声明、作用域链、this的值等信息。
执行上下文生命周期
- 创建阶段:在这个阶段,执行上下文会创建变量对象、建立作用域链、确定this的值。在这个阶段,函数声明和变量声明会被提升到作用域的顶部。
- 执行阶段:在这个阶段,执行上下文会执行代码,变量赋值、函数调用等操作都会在这个阶段进行。
- 回收阶段:在这个阶段,执行上下文会被销毁,变量和函数声明会被回收。
变量对象
变量对象是执行上下文中的一个对象,它包含了当前执行上下文中的变量和函数声明。在创建阶段,变量对象会被创建,并且函数声明会被提升到作用域的顶部。在执行阶段,变量对象会被激活,变量和函数声明会被赋值。在浏览器中,window对象就是全局执行上下文的变量对象。
作用域链
作用域链是执行上下文中的一个对象链,它包含了当前执行上下文中的变量和函数声明。当在执行上下文中查找一个变量时,会先在当前执行上下文的变量对象中查找,如果找不到,就会沿着作用域链向上查找,直到找到为止。
执行栈
执行栈是JavaScript引擎中的一个数据结构,它用于管理执行上下文的创建和销毁;先进后出,用来存储代码运行的有执行上下文
1.当JS引擎第一次遇到js脚本时,会创建一个全局上下文并且压入当前执行栈中
2.当JS引擎遇到一个函数调用,他会该为函数创建一个新的执行上下文,并且压入执行栈的顶部
3.当函数执行完毕,执行上下文会从执行栈中弹出,并且控制权交回给之前的执行上下文
4.一旦所以代码执行完毕,JS引擎从当前栈中移除全局执行上下文
var a = 1 // 1.全局上下文环境
function bar () {
console.log('bar')
var b = 2
fn (x + b) // 3.fn
}
function fn (c) {
console.log('fn', c)
}
bar(3) // 2.bar上下文环境
全局、函数、Eval执行上下文
执行上下文分为全局、函数、Eval执行上下文
1)全局执行上下文(浏览器环境下,为全局的 window 对象)
2)函数执行上下文,每当一个函数被调用时, 都会为该函数创建一个新的上下文
3)Eval 函数执行上下文,如eval(“1 + 2”)
对于每个执行上下文,都有三个重要属性:变量对象、作用域链(Scope chain)、this
执行上下文的特点:
1)单线程,只在主线程上运行;
2)同步执行,从上向下按顺序执行;
3)全局上下文只有一个,也就是window对象;
4)函数每调用一次就会产生一个新的执行上下文环境。