执行上下文
概念
执行上下文是评估和执行 JavaScript 代码的环境的抽象概念。
执行上下文的类型
全局执行上下文
- 不在函数内部的代码都属于全局执行上下文,
- 全局执行上下文会创建一个window对象(浏览器环境下),然后设置this的值等于window,
- 一个程序中只会有一个全局执行上下文。
函数执行上下文
- 函数被调用时创建。
- 当一个新的执行上下文被创建,它会按定义的顺序执行一系列步骤。
Eval 函数执行上下文
- eval()函数动态执行的代码并不会创建新的作用域,其代码就是在当前的作用域执行的。
- eval()函数也完全可以使用当前作用域的this,argument等对象。
执行盏
- 一种拥有 LIFO(后进先出)数据结构的栈,
- 被用来存储代码运行时创建的所有执行上下文。
- 当 JavaScript 引擎第一次遇到你的脚本时,它会创建一个全局的执行上下文并且压入当前执行栈。
- 每当引擎遇到一个函数调用,它会为该函数创建一个新的执行上下文并压入栈的顶部。
- 引擎会执行那些执行上下文位于栈顶的函数。
- 当该函数执行结束时,执行上下文从栈中弹出,控制流程到达当前栈中的下一个上下文。
this绑定
- 在全局执行上下文中,this 的值指向全局对象。(在浏览器中,this引用 Window 对象)。
- 在函数执行上下文中,this 的值取决于该函数是如何被调用的。如果它被一个引用对象调用,那么 this 会被设置成那个对象,否则 this 的值被设置为全局对象或者 undefined(在严格模式下)。