图解Javascript——执行上下文

摘要:
js中只有两种情况可以让一段代码开始执行:加载整个js文件,调用js中的函数来执行。因此,执行上下文被分为:全局上下文函数上下文(在调用和执行函数时建立的上下文。每次调用函数时,都会为其创建一个新的执行上下文,甚至是调用函数本身。

什么是执行上下文?


 

       执行上下文(Execution Context)是ECMAScript规范中用来描述 JavaScript 代码执行的抽象概念,规定了当前代码执行的环境(当前执行代码片段中的变量、函数、作用域链等),所有执行上下文又叫执行环境。

图解Javascript——执行上下文第1张

 

       只有一段代码块开始执行时才会创建执行上下文。js中能够使一段代码开始执行的无非两种情况:整个js文件被加载后开始执行、js中函数被调用执行。所以执行上下文分为:

  • 全局上下文(整个js文件被加载执行建立的上下文,必有且唯一)
  • 函数上下文(函数被调用执行时建立的上下文,每次某个函数被调用,就会有个新的执行上下文为其创建,即使是调用的自身函数,也是如此。)

代码执行过程中执行上下文是如何被管理的?


 

       我们从一段代码的执行过程来看执行上下文的创建、进栈、出栈、等待回收的过程。

 

var a = 10;
var b = 'hello';

function fun01 () {
    console.log('i am fun01...');
    fun02();
}

function fun02 () {
    console.log('i am fun02...');
}

fun01();

       js的运行采用栈的方式对执行上下文进行管理,栈底始终是全局上下文,栈顶始终是正在被调用执行的函数的执行上下文。

图解Javascript——执行上下文第2张

1.当js文件开始执行时,创建全局上下文,并push到call stack;

2.fun01()被调用时,创建fun01上下文,push到call stack;

3.fun02()被调用时,创建fun02上下文,push到call stack;

4.fun02()执行完毕,fun02上下文pop出栈,等待被回收;

5.fun01()执行完毕,fun01上下文pop出栈,等待被回收;

6.全局执行环境不会出栈;

 

 

执行上下文生命周期?


图解Javascript——执行上下文第3张

 

 

       执行上下文生命周期分为创建阶段、执行阶段、执行完毕,我们上面说到执行上下文是代码执行的一种抽象,而代码执行出了整个js开始执行之外,代码的执行都是通过函数调用执行的,所以执行上下文生命周期的各个阶段其实是可以分别对应函数被调用时的初始化、执行、执行完毕阶段的。

执行环境层面暂时告一段落,每个阶段都做了什么下次再说。

 

我是Han,我的终极梦想不是世界和平,而是不劳而获!thx!

免责声明:文章转载自《图解Javascript——执行上下文》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇RNN梯度问题解决maven项目无法读取src/main/java目录下面的配置文件问题下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

openssl3.0 加密算法库编程精要 04 详解 EVP API 消息摘要

4.1 消息摘要的概念   消息摘要有好几个名字,比如单项散列函数,Hash 函数,它是一个将可变长度的输入串转换为一个固定长度的输出 串的函数。大多数消息摘要算法都是公开的,它的安全性依赖于它的单向性,如果仅获取到消息摘要的结果,想要从结果 反推出原文几乎是不可能的事情。并且对于输入串的细微改变,都会引发输出串的雪崩式变化,所以消息摘要一般用于校 验数据...

CPU上下文切换分析

一、CPU上下文切换 1、上下文切换,有时也称做进程切换或任务切换,是指CPU从一个进程或线程切换到另一个进程或线程。 2、vmstat是一个常用的系统性能分析工具,主要用来分析系统内存使用情况,也常用来分析CPU上下文切换和中断的次数。 例:vmstat -w 上下文切换需要特别关注的四列内容: cs(context switch)  是每秒上下文切换...

SpringApplication类-1

SpringApplication类提供了一种方便的方法来引导从main()方法启动的Spring应用程序。在许多情况下,可以委托给静态SpringApplication.run方法,如下例所示: public static voidmain(String[] args) { SpringApplication.run(MySpringConfig...

Qt Linguist介绍

简介 Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的翻译工具。发布者、翻译者和开发者可以使用这款工具来完成他们的任务。 发布者:承担了全面发布应用程序的责任。通常,他们协调开发者和翻译者的工作,可以使用lupdate工具同步源代码,进行翻译,使用lrelease同步工具为发布应用程序创建运行时使用的翻译文件。 翻译者:可以使用Qt Li...

数据可视化之DAX篇(二)Power BI中的度量值和计算列,你搞清楚了吗?

https://zhuanlan.zhihu.com/p/75462046 对于初学者,总是会把度量值和计算列搞混,我也经常碰到这样的问题,有些星友用文章中的代码总是报错,发给我一看,才知道TA把本来是度量值的DAX用在了计算列上,或者相反。 即使是已经学习了很长时间的人,对于计算列和度量值的写法也未必轻车熟路,还是有可能不明白其中到底有什么不同,这篇文章...

.NET Core授权失败如何自定义响应信息?

前言 在.NET 5之前,当授权失败即403时无法很友好的自定义错误信息,以致于比如利用Vue获取到的是空响应,不能很好的处理实际业务,同时涉及到权限粒度控制到控制器、Action,也不能很好的获取对应路由信息。本文我们来看看在.NET 5中为何要出现针对授权失败的中间件接口?它是如何一步步衍生出来的呢?以及对于授权失败根据实际需要如何自定义响应错误,以及...