作用域和执行上下文

文章详细阐述了JavaScript中的执行上下文,包括全局、函数和eval上下文,以及执行上下文栈的工作机制。它强调了创建阶段的词法环境和变量环境的区别,并详细介绍了程序执行的全过程,从全局到函数调用的上下文创建和this的绑定。
摘要由CSDN通过智能技术生成

目录

作用域和执行上下文

执行上下文分类

执行上下文栈

执行上下文创建

词法环境和变量环境

包含的组件

区别

 分析程序执行全过程


JavaScript属于解释型语言,其运行包括解释和执行两个阶段

作用域和执行上下文

确定时间能否改变
作用域函数定义时
执行上下文函数执行之前随时可能改变

关系:一个作用域下可能包含多个执行上下文

执行上下文分类

  • 全局执行上下文:一个程序只有一个全局执行上下文
  • 函数执行上下文:在函数调用时为其创建新的执行上下文
  • eval函数执行上下文:执行在 eval 函数也会有自己的执行上下文

执行上下文栈

js引擎执行时,首先创建一个全局执行上下文并压入栈中,每当遇到函数调用时,都将为其创建一个新的函数执行上下文并压入栈中,引擎会执行栈顶的函数,函数执行完成之后将其从栈中弹出。遵循后进先出的原则。当函数全部执行结束时,将全局执行上下文从栈中弹出。

执行上下文创建

执行上下文周期分为三阶段:创建阶段→执行阶段→回收阶段,这里重点介绍创建阶段

创建阶段分为三步:

  1. 词法环境组件
  2. 变量环境组件
  3. this绑定

词法环境和变量环境

包含的组件

  • 环境记录器:是存储变量和函数声明的实际位置。
    • 全局环境-对象环境记录器:定义出现在全局上下文中的变量和函数的关系。
    • 局部环境-声明式环境记录器:存储变量、函数和参数和一个传递给函数的 arguments 对象(此对象存储索引和参数的映射)和传递给函数的参数的 length
  • 外部环境的引用:意味着它可以访问其父级词法环境。

区别

  • 词法环境:存储变量(let 和 const)绑定
  • 变量环境:存储 var 变量绑定

 

分析程序执行全过程

  1. 程序启动,全局执行上下文被创建,压入调用栈
    1. 创建全局上下文的 词法环境
      1. 创建 对象环境记录器 ,它用来定义出现在 全局上下文 中的变量和函数的关系(负责处理 letconst 定义的变量)
      2. 创建 外部环境引用,值为 null
    2. 创建全局上下文的 变量环境
      1. 创建 对象环境记录器,它持有 变量声明语句 在执行上下文中创建的绑定关系(负责处理 var 定义的变量,初始值为 undefined 造成声明提升)
      2. 创建 外部环境引用,值为 null
    3. 确定 this 值为全局对象(以浏览器为例,就是 window
  2. 函数被调用,函数执行上下文被创建,压入调用栈

    1. 创建函数上下文的 词法环境
      1. 创建 声明式环境记录器 ,存储变量、函数和参数,它包含了一个传递给函数的 arguments 对象(此对象存储索引和参数的映射)和传递给函数的参数的 length。(负责处理 letconst 定义的变量)
      2. 创建 外部环境引用,值为全局对象,或者为父级词法环境(作用域)
    2. 创建函数上下文的 变量环境
      1. 创建 声明式环境记录器 ,存储变量、函数和参数,它包含了一个传递给函数的 arguments 对象(此对象存储索引和参数的映射)和传递给函数的参数的 length。(负责处理 var 定义的变量,初始值为 undefined 造成声明提升)
      2. 创建 外部环境引用,值为全局对象,或者为父级词法环境(作用域)
    3. 确定 this
  3. 进入函数执行上下文的执行阶段

    1. 在上下文中运行/解释函数代码,并在代码逐行执行时分配变量值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值