执行上下文和调用栈是JavaScript中非常重要的概念,它们共同定义了JavaScript代码的执行方式和顺序。 执行上下文(Execution Context) :每当JavaScript引擎遇到代码,就会创建一个执行上下文。执行上下文定义了变量、函数、对象等的归属和访问权限。它有三种类型: 全局执行上下文:这是默认的、最外层的执行上下文。 函数执行上下文:每当一个函数被调用时,就会创建一个新的函数执行上下文。 Eval函数执行上下文:在eval函数中执行的代码会有它自己的执行上下文,但由于安全问题,现代浏览器正逐步废弃对eval的支持。 调用栈(Call Stack) :调用栈是一种数据结构,用于跟踪执行上下文的顺序。当JavaScript执行代码时,它会将执行上下文推入调用栈中。当函数执行完毕后,其对应的执行上下文会从调用栈中弹出。调用栈遵循LIFO(Last In First Out)的原则,即最后进入的执行上下文最先被弹出。
调用栈的工作流程如下: 当JavaScript代码开始执行时,会先创建一个全局执行上下文并推入调用栈中。 当遇到函数调用时,会创建一个新的函数执行上下文并推入调用栈中。 函数执行完毕后,其执行上下文会从调用栈中弹出,控制权回到调用该函数的执行上下文。 执行上下文和调用栈共同确保了JavaScript代码以预期的顺序执行,同时也处理了变量作用域和函数调用等问题。