JavaScript的执行上下文

JavaScript的执行上下文

第一遍翻红宝书,读到执行上下文这一块时觉得十分生涩难懂,一直卡在上下文这几个字眼导致后面的变量对象,作用域链已经this指向问题都是一知半解的状态,今天读第二遍才彻底弄懂这个东西,所以想把它记录下来,日后还有疑惑可以回来看看。

执行上下文是什么?

在一个JavaScript程序中,执行上下文决定了函数的执行顺序,当JavaScript控制器转到可执行代码的时候,就会进入一个执行上下文。执行上下文可以把它看作是代码的运行环境,我个人觉得把它当作用域会更容易理解,
JavaScript的执行上下文主要可以分为三个情况:

  1. 全局上下文 ,js程序执行首先会进入的环境;
  2. 函数上下文,每当一个函数执行的时候,会创建它的执行上下文,实际上就是函数内的作用域;
  3. eval(很少使用了~)

JavaScript的执行顺序

一个JavaScript程序执行下来,会产生多个执行上下文,它们决定了代码该如何执行,何时执行。首先,代码开始执行时,JavaScript会以栈的形式来处理这些执行上下文,这个栈也可以成为函数调用栈,因为除去全局上下文以外都是函数的上下文,栈底永远是全局上下文,栈顶则永远是正在执行的函数上下文。
当代码执行时,首先全局上下文会进入栈底,随后继续执行,当执行到函数调用时,会创建该函数的执行上下文。若函数中有其他函数调用,则往栈顶继续添加其他函数的执行上下文,当函数执行完毕后,会弹出栈顶,下面举个例子说明。
此处是演示代码

首先看执行环境,全局上下文入栈。
在这里插入图片描述

全局上下文入栈以后,其他代码开始执行,先执行到getAge函数,JavaScript会创建getAge函数的执行上下文,并压入函数调用栈的栈顶。
在这里插入图片描述

随后,再getAge函数中又调用了getName函数,同理会创建getName的执行上下文,并压入栈顶。
在这里插入图片描述

若getName函数中没有其他函数调用,则getName执行完毕后,该函数的上下文出栈,
在这里插入图片描述
若getAge函数内部没有其他函数调用,则getAge函数执行完毕后其上下文出栈。
在这里插入图片描述
继续执行其他代码,若没有遇到函数执行,则执行完所有代码。当浏览器关闭之后,全局上下文出栈,至此函数调用栈被彻底清空。要注意若函数中又return,则会直接将该函数的上下文弹出。

总结

1 JavaScript的函数执行顺序是靠执行上下文决定的,即每次都是栈顶的函数上下文先执行,接着依次向下,单线程执行。
2 全局上下文有且只有唯一一个,当浏览器关闭时出栈。
3 函数的执行上下文没有数量限制。
4 函数的执行上下文在其调用时创建,而不是在函数定义时。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值