执行上下文
执行上下文是当前JavaScript被解析和运行时所在环境的抽象概念。
执行上下文的类型
- 全局执行上下文:只有一个,浏览器的全局对象就是windows对象,this指向这个对象。
- 函数执行上下文:只有在函数被调用的时候才会被创建。每次调用函数都会创建一个新的函数执行上下文。
- eval执行上下文:运行在eval函数中的代码。
执行栈
执行栈,也叫任务栈。具有LIFO(后进先出)的结构。用于存储代码运行期间创建的所有执行上下文。
- 首次运行代码时,会创建一个全局的执行上下文,并push到执行栈中。每当发生函数调用,都会创建一个函数执行上下文,并push到当前的执行栈中。
- 根据任务栈LIFO的结构,当栈顶函数调用完毕后,会从执行栈的栈顶pop出这个函数的函数执行上下文。上下文控制权会移交给下一个执行上下文。
function first() {
console.log('Inside first function');
second();
console.log('Again inside first function');
}
function second() {
console.log('Inside second function');
}
first();
console.log('Inside Global Execution Context');
// Inside first function
// Inside second function
// Again inside first function
// Inside Global Execution Context
执行上下文的创建
执行上下文分为两个阶段进行创建:1.创建阶段,2.执行阶段
创建阶段
- 确定 this 的值,也就是 this binding
- LexicalEnvironment(词法环境) 组件被创建。
- VariableEnvironment(变量环境) 组件被创建。