JavaScript代码的整个执行过程分为两个阶段:编译期 和 执行期
- 第一阶段为编译器编辑,解析语法,翻译成可执行代码,确定作用域
- 第二阶段首先会创建执行环境,代码执行,执行完毕后内存回收
而创建执行环境又分为两个阶段
- 创建执行环境中又分为 创建阶段 和 执行阶段
- 创建阶段首先会生成 变量对象(活动对象),创建作用域链,确定this指向(也就是上下文)
- 执行阶段先进行变量赋值,函数引用,执行代码
------------------------------------------------------------------------------------------------------------------------------------------------
执行环境和执行上下文是一样的只是说法不同
作用域是什么?
我们可以将作用域定义为一套规则,这套规则用来管理在当前作用域以及嵌套的子作用域中变量和函数的查找
作用域分类:
- 全局作用域
- 局部作用域
每个函数都有自己的作用域,此为局部作用域,函数的做外层的环境为全局作用域。执行的过程中才会创建作用域链。
全局变量可以被随意访问和修改
变量对象
执行环境是Javascript最重要的概念之一,每个执行环境都有一个自己的变量对象,变量对象包括当前执行环境的所有变量,最初时只有arguments对象。(包含函数参数,内部变量和函数声明)
作用域链
当代码执行时,会创建变量对象的一个作用域连,作用域链的最前端永远是当前执行环境的变量对象。作用域链的下一个变量对象来自包含环境(外部环境),以此类推,直到全局环境。
当某个执行环境中的所有代码执行完毕后,该被环境销毁,保存在其中的所有变量和函数也将被销毁;全局环境只有在关闭页面的情况下才会被销毁。(包含自己的变量对象和父级执行上下文的其他变量对象)
上下文
上下文是指 this
在同一作用域内的值,作用域是只变量的可访问性。
执行上下文和上下文不是一种概念。