浅谈前端面试题 JavaScript 执行上下文和执行栈

执行上下文:

什么是执行上下文

先看一段代码在浏览器中的执行结果:

console.log(a);
b();
console.log(this);
var a = 1;
function b(){
    console.log("b")
}

执行结果:
img

我们都知道javascript是一种解释性语言 ,它会从上至下逐行执行,但是很明显以上代码就不是这回事。其实javascript在执行代码前,会做的一些准备工作,这就是创建对应的执行上下文,可以抽象的理解为执行上下文就是Javascript执行时存在的环境。

执行上下文的类型

全局执行上下文

  1. javascript在执行代码前,将window确定为全局执行上下文。

  2. 对全局的数据进行预处理:

    1)var 定义的全局变量,初始值为 undefined,造成声明提升 ,并添加为window的属性。

    2)function声明的全局函数添加为window的方法。

    3)将this的指针执行全局对象window。点击进入js中的多种this指向详解

  3. 开始执行全局代码。

函数执行上下文

  1. 在调用函数,准备执行函数体前,临时创建对应的函数上下文对象。

  2. 对局部数据进行预处理:

    1)首先会初始化函数的参数arguments,添加为函数上下文对象的属性。

    2)var 定义的局部变量,初始值为 undefined,造成声明提升 ,并添加为函数上下文对象的属性。

    3)function声明的函数添加为函数上下文对象的方法。

    4)将this的指针指向调用函数的对象。点击进入js中的多种this指向详解

  3. 开始执行代码

执行上下文栈

在全局执行代码前,JS引擎会创建一个栈来存储管理所有的执行上下文对象

在全局执行上下文(window)确定后,将其添加到栈中

在函数执行上下文创建后,将其添加到栈中

当前函数执行完后,将栈顶对象移除

当所有代码执行完后,栈中只剩下window

在这里插入图片描述

eval函数执行上下文

运行在eval函数中的代码也获得了自己的执行上下文。

执行上下文的生命周期

创建阶段 - 执行阶段 - 回收阶段

1)创建阶段

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

  1. 创建变量对象:首先会初始化函数的参数arguments,提升函数声明和变量声明
  2. 创建作用域连:在执行上下文创建阶段,作用域链是在变量对象之后创建的,
  3. 确定this指向

2)指向阶段

变量赋值,代码执行

3)执行上下文出栈,等待垃圾回收。

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 13
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉沦与遐想。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值