3.理解JavaScript的执行上下文、执行上下文栈,可以应用堆栈信息快速定位问题

1.执行上下文

执行上下文就是当前 JavaScript 代码被解析和执行时所在环境的抽象概念, JavaScript 中运行任何的代码都是在执行上下文中运行

1.执行上下文的类型

  • 全局执行上下文:她做了两件事:①创建了一个全局对象,在浏览器中就是window对象②将this指针指向这个全局对象。一个程序只能存在一个全局执行上下文
  • 函数执行上下文:记住只有调用的时候才会创建函数执行上下文。一个程序中可以存在任意数量的函数执行上下文。每当一个新的执行上下文被创建,它都会按照特定的顺序执行一系列步骤
  • eval函数执行上下文:一个程序中可以存在任意数量的函数执行上下文。每当一个新的执行上下文被创建,它都会按照特定的顺序执行一系列步骤

2.执行上下文的生命周期

1.创建阶段

当函数被调用,但未执行任何其内部代码之前,会做以下三件事:

  • 创建变量对象:首先初始化函数的参数 arguments,提升函数声明和变量声明。下文会详细说明。
  • 创建作用域链(Scope Chain):在执行期上下文的创建阶段,作用域链是在变量对象之后创建的。作用域链本身包含变量对象。作用域链用于解析变量。当被要求解析变量时,JavaScript 始终从代码嵌套的最内层开始,如果最内层没有找到变量,就会跳转到上一层父作用域中查找,直到找到该变量。
  • 确定 this 指向:包括多种情况,下文会详细说明

在一段 JS 脚本执行之前,要先解析代码(所以说 JS 是解释执行的脚本语言),解析的时候会先创建一个全局执行上下文环境,先把代码中即将执行的变量、函数声明都拿出来。变量先暂时赋值为 undefined,函数则先声明好可使用。这一步做完了,然后再开始正式执行程序。

另外,一个函数在执行之前,也会创建一个函数执行上下文环境,跟全局上下文差不多,不过 函数执行上下文中会多出 this arguments 和函数的参数。

2.执行阶段

执行变量赋值、代码执行

3.回收阶段

执行上下文出栈等待虚拟机回收执行上下文

3.确定this指向

 this 的值是在执行的时候才能确认,定义的时候不能确认!

4.执行上下文栈

那么多函数执行上下文,自然需要执行上下文栈,遵循先进后出

关键点:

  • js是单线程,所有的代码都是排队执行
  • 一开始执行,首先创建全局的执行上下文,压入执行栈的顶部
  • 每当进入一个函数的执行就会创建一个函数的执行上下文,并且把他压入栈的顶部,当前函数执行完成后,当前函数的执行上下文出栈,并等待垃圾回收。
  • 浏览器的 JS 执行引擎总是访问栈顶的执行上下文
  • 全局上下文只有唯一的一个,它在浏览器关闭时出栈

 

posted @ 2023-03-04 12:03  不想做混子的奋斗远  阅读(23)  评论(1)    收藏  举报