在JavaScript中,执行上下文是代码执行时的环境,它由变量、函数和对象的作用域和生命周期决定。执行栈则是用来存储当前执行上下文的栈结构,每次进入一个新的执行上下文时都会将其推入栈顶,执行结束后再弹出栈顶的执行上下文。
以下是一个示例代码,用于演示执行上下文和执行栈:
function outer() {
var outerVariable = 'outer';
function inner() {
var innerVariable = 'inner';
console.log(innerVariable);
console.log(outerVariable);
}
inner();
}
outer();
在上述代码中,执行上下文包括:
全局执行上下文,它是最先进入执行栈的上下文,它包括全局作用域中的变量、函数和对象。
outer函数的执行上下文,它是由outer函数调用而创建的上下文,包括outer函数中的变量、函数和对象。
inner函数的执行上下文,它是由inner函数调用而创建的上下文,包括inner函数中的变量、函数和对象。
执行栈的状态如下:
+—————————————-+
| inner() 上下文 |
+—————————————-+
| outer() 上下文 |
+—————————————-+
| 全局执行上下文 |
+—————————————-+
当代码开始执行时,全局执行上下文最先进入执行栈。然后,在outer函数被调用时,outer函数的执行上下文被创建并推入执行栈的栈顶。接着,在inner函数被调用时,inner函数的执行上下文被创建并推入执行栈的栈顶。
当inner函数执行完毕时,它的执行上下文从执行栈中弹出。接下来,当outer函数执行完毕时,它的执行上下文也被弹出。最后,全局执行上下文留在执行栈中,程序结束。