执行上下文(执行环境)
执行环境定义了变量或函数有权访问的其他数据,决定它们各自的行为。每一个执行环境都存在一个变量对象,环境中定义的变量和函数都保存在这个对象中。虽然我们编写的代码无法访问到这个对象,但是解析器处理数据的时候会在后台使用它。
全局执行环境
全局执行环境是最外层的一个执行环境,有且只有一个。EMCAScript 所在的不同宿主机中,全局执行环境也不一样。在浏览器中全局执行环境是 window 对象,因此所有的全局变量和函数都作为 window 的属性和方法。在 node 中全局执行环境是 global 。全局执行环境在浏览器或网页关闭时被销毁,其保持的变量和函数定义也随之销毁。
函数执行环境
当执行流进入一个函数的时候,就会创建一个函数的执行环境,将这个函数的执行环境推入执行栈中,等函数执行完成后,就会将执行环境在执行栈中出栈,销毁执行环境中存储的变量。
Eval 执行环境
在 Eval 中执行的代码也有自己的执行上下文。
执行栈
执行栈,用来存储代码运行时创建的所有执行上下文。当 JavaScript 引擎第一次执行你的脚本时,会创建一个全局全局执行环境,将全局执行环境推入执行栈中。当执行流进到一个函数的时候,该函数的执行环境被推入执行栈中,而函数执行之后,栈将其环境弹出,将控制权交给之前执行环境。JavaScript 的执行机制,便是这种方式控制着。