JavaScript 代码运行前的预处理-执行上下文对象

先看一段代码:

console.log(a); //在变量a定义之前,直接输出a,输出a的值是多少?会有报错吗?
var a = 1;
console.log(a); //定义之后,肯定会正常输出a的值

来看一下结果:
image.png
看到这小伙伴们是否有疑问,在变量a定义之前,进行打印a的操作,竟然没有报错,输出的结果是undefined,这是为什么呢?我们学习js的时候,知道变量未定义是不能直接使用的,如下图,那么这个地方为什么没有报错呢?
image.png

很多编程语言在执行代码之前会进行代码的预处理,同样js亦是如此。在代码执行之前,会有一个执行上下文对象,在这个过程中会预先对代码进行处理,根据代码种类的不同,映射出两种不同的执行上下文对象:

1. 代码分类或执行上下文的种类

  • 全局代码 -------->>全局执行上下文
  • 局部代码/函数码 -------->>函数执行上下文

2. 全局执行上下文-全局代码的执行处理

  1. 在全局代码执行之前,会有一个执行上下文对象,这个对象被称之为“全局上下文”对象,这个对象是真实存在的,对应的是Window对象;
  2. 在全局代码执行之前会进行代码的预处理,包括:
  • 找到var对应的变量,并将其赋值为undefined,添加该变量为window对象。(其实不是赋值,window中添加该变量较为准确)
  • 找到function声明的全局函数,并且赋值为函数地址,并添加为window的全局方法
  • 将this赋值为window
  1. ==>执行全局代码

3.函数执行上下文-函数代码的执行处理

  1. 在调用函数时,执行函数之前会创建函数执行上下文对象,这个对象是虚拟的,存在于栈当中
  2. 在函数体执行之前,进行函数数据的预处理
  • 将函数的形参赋值为实参,并添加到上下文对象的属性当中
  • 将arguments赋值为实参列表,添加到函数执行上下文属性当中
    -找到var声明的变量,并将其添加到函数执行上下文对象当中
    -将内部function声明的函数赋值为fun,添加到上下文对象当中
  • 将this赋值为调用该函数的对象
  1. ==>执行函数代码
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

冰sir2021

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

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

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

打赏作者

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

抵扣说明:

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

余额充值