js执行上下文复习和汇总

73 阅读2分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战 !

u=4027634295,2407078359&fm=26&fmt=auto&gp=0.jpg

定义

当代码运行时,会产生一个对应的执行环境,在这个环境中,所有变量会被事先提出来(变量提升),有的直接赋值,有的为默认值 undefined,代码从上往下开始执行,就叫做执行上下文

JavaScript执行环境分为:全局环境、函数环境、eval函数环境 (已不推荐使用)

分类:

分为全局执行上下文、函数执行上下文、eval函数执行上下文(不展开说明)

全局执行上下文和函数执行上下文区别在于全局执行上下文只有一个,函数执行上下文在每次调用函数时候会创建一个新的函数执行上下文

JavaScript运行时首先会进入全局环境,对应会生成全局上下文。程序代码中基本都会存在函数,那么调用函数,就会进入函数执行环境,对应就会生成该函数的执行上下文

生命周期

主要分为创建阶段和执行阶段

  • 创建阶段 (1) 创建变量对象

    函数环境会初始化创建 Arguments对象并赋值

    函数声明并赋值

    变量声明,函数表达式声明但是未赋值

(2) 确定this指向

(3) 确定作用域

  • 执行阶段

    (1) 变量赋值

    (2) 函数的引用

    (3) 执行其他代码

image.png

变量对象

变量对象是与执行上下文相关的数据作用域,存储了上下文中定义的变量和函数声明。

变量对象是一个抽象的概念,在不同的上下文中,表示不同的对象:

  1. 全局执行上下文的变量对象

    全局执行上下文中,变量对象就是全局对象。

    在顶层js代码中,this指向全局对象,全局变量会作为该对象的属性来被查询。在浏览器中,window就是全局对象

  2. 函数执行上下文的变量对象

    函数上下文中,变量对象初始化只包括Arguments对象

执行上下文栈

执行全局代码时,会产生一个执行上下文环境,每次调用函数都又会产生执行上下文环境。当函数调用完成时,这个上下文环境以及其中的数据都会被消除,再重新回到全局上下文环境。处于活动状态的执行上下文环境只有一个。这是一个压栈出栈的过程叫做执行上下文栈