JS基础之执行上下文

JS基础之执行上下文

  • 执行上下文
    • 顺序执行
    • 可执行代码
    • 执行上下文栈
    • 回顾上文

执行上下文

顺序执行

写个JavaScript的开发者都会有个直观的印象,那就是顺序执行:

var foo = function(){console.log('foo1')
}
foo(); //foo1
var foo = function(){console.log('foo2');
}
foo();//foo2

那这段呢?

function foo(){console.log('foo1');
}
foo(); // foo2
function foo(){console.log('foo2');
}
foo(); //foo2

打印的结果却是两个foo2
这是因为JavaScript引擎并非一行一行的分析和执行程序,而是一段一段的分析执行。当执行一段代码的时候,会进行一个“准备工作”,那这个“一段一段”中的“段”究竟是怎么划分的呢?
到底JavaScript引擎遇到一段怎样的代码时,才会做“准备工作”呢?

console.log(add2(1,2));//输出3
function add2(a,b){return a+b;
}
console.log(add1(1,1));//报错:add1 is not a function
var add1 = function(a,b){return a+b;
}
//用函数语句创建的函数add2,函数名称和函数体均被提前,在声明他之前就使用它。
//但是使用var表达式定义函数add1,只有变量声明提前了,变量初始化代码仍然在原来的位置,没有办法提前执行。

可执行代码

这就要说到JavaScript的可执行代码(executable code)的类型有哪些了?
其实很简单,就三种,全局代码、函数代码、eval代码
举个例子,当执行到一个函数的时候,就会进行准备工作,这里的“准备工作”,让我们用更专业的说法,就叫做“执行上下文(execution context)”。

执行上下文栈

JavaScript引擎创建了执行上下文栈(Execution Context stack, ECS)来管理执行上下文,为了模拟执行上下文栈的行为,让我们定义执行上下文栈是一个数组:

ECStack = [];

试想当JavaScript开始要解释执行代码的时候,最先遇到的 就是全局代码,所以初始化的时候首先就会向执行上下文栈压入一个全局执行上下文,我们用globalContext表示它,并且只有当整个应用程序结束的时候,ECStack才会被清空,所以程序结束之前,ECStack最底部永远有个globalContext

ECStack = [globalContext
];

当JavaScript遇到下面的这段代码了:

function fun3(){console.log('fun3');
}
function fun2(){fun3();
}
function fun1(){fun2();
}
fun1();

当执行一个函数的时候,就会创建一个执行上下文,并且压入执行上下文栈,当函数执行完毕的时候,就会将函数的执行上下文从栈中弹出。知道了这样的工作原理,让我们来看看如何处理上面这段代码:

//伪代码
//fun1()
ESCtack.push(<fun1> functionContext);//入栈
//fun1中竟然调用了fun2,还要创建fun2的执行上下文
ESCtack.push(<fun2> functionContext);//入栈
//fun2还调用了fun3!
ESCtack.push(<fun3> functionContext);//入栈
//fun3执行完毕
ESCtack.pop();//出栈
//fun2执行完毕
ESCtack.pop();//出栈
//fun1执行完毕
ESCtack.pop();//出栈
//javascript接着执行下面的代码,但是ESCtack底层永远有个globalContext

回顾上文

//case 1
var scope = "global scope";
function checkscope(){var scope = "local scope";function f(){return scope;}return f();
}
checkscope();//case 2
var scope = "global scope";
function checkscope(){var scope = "local scope";function f(){return scope;}return f;
}
checkscope()();

两段代码执行的结果一样,但是两段代码究竟有哪些不同呢?
答案是:执行上下文栈的变化不一样。
模拟第一段代码:

ECStack.push(<checkscope> functionContext);//入栈
ECStack.push(<f> functionContext);//入栈
ECStack.pop();//出栈
ECStack.pop();//出栈

模拟第二段:

ECStack.push(<checkscope> functionContext);
ECStack.pop();//出栈
ECStack.push(<f> functionContext);//入栈
ECStack.pop()//出栈

这就是上文说到的区别。

好啦!这期就到这里啦,欢迎友友们留言讨论呐~
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/214942.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

HTML面试题---专题一

文章目录 一、前言二、 HTML5 中 <header> 和 <footer> 标签的用途是什么&#xff1f;三、如何在 HTML 中嵌入 SVG&#xff08;可缩放矢量图形&#xff09;文件&#xff1f;四、解释 contenteditable 属性的用途五、如何创建随屏幕尺寸缩放的响应式图像&#xff1f…

八大排序算法【上】

冒泡排序 冒泡排序是一种 稳定 的排序算法。 它的工作原理是每次检查相邻两个元素&#xff0c;如果前面的元素与后面的元素满足给定的排序条件&#xff0c;就将相邻两个元素交换。当没有相邻的元素需要交换时&#xff0c;排序就完成了。 假设我们想要从小到大进行排序&#…

大模型:常见的文字表情包(可以直接加到微调数据里)

大模型&#xff1a;常见的文字表情包(可以直接加到微调数据里) 返回论文目录 返回资料目录 表情符号含义&#x1f60a;愉快、微笑&#x1f602;大笑&#x1f60d;爱心眼&#x1f60e;酷、自信&#x1f914;思考、疑惑&#x1f61c;调皮、顽皮&#x1f64c;鼓掌、庆祝&#x1f…

线上扭蛋机小程序搭建,扭蛋与科技的完美结合

扭蛋机作为当下比较热门的一种盲盒玩法&#xff0c;在年轻人群体中非常受欢迎。随着经济的增长和人们生活水平的提高&#xff0c;人们对娱乐消费需求也在增加&#xff0c;扭蛋机的受众群体也在扩大。 目前线上扭蛋机小程序也获得了大众的青睐&#xff0c;扭蛋机小程序就是把线…

记录一下快速上手Springboot登录注册项目

本教程需要安装以下工具&#xff0c;如果不清楚怎么安装的可以看下我的这篇文章 链接: https://blog.csdn.net/qq_30627241/article/details/134804675 管理工具&#xff1a; maven IDE&#xff1a; IDEA 数据库&#xff1a; MySQL 测试工具&#xff1a; Postman 打开IDE…

Ansys结构静力学仿真的一般流程

1. 模型实体 三维几何模型的构建。 2. 材料属性 根据实际情况&#xff0c;为模型中的各个部分定义材料属性&#xff0c;包括弹性模量、泊松比、密度等。 3. 单元类型 node 结点数等 4. 网格划分 网格属性&#xff08;尺寸&#xff09; 5. 边界条件 这个定义有点模糊&#x…

AR-LDM原理及代码分析

AR-LDM原理AR-LDM代码分析pytorch_lightning(pl)的hook流程main.py 具体分析TrainSampleLightningDatasetARLDM blip mm encoder AR-LDM原理 左边是模仿了自回归地从1, 2, ..., j-1来构造 j 时刻的 frame 的过程。 在普通Stable Diffusion的基础上&#xff0c;使用了1, 2, .…

天池SQL训练营(六)-综合练习题-10道经典题目

如果你还没有学习过SQL训练营的以下知识&#xff0c;请查阅主页博文学习&#xff1a; Task 1 SQL基础&#xff1a;初识数据库与SQL-安装与基本介绍等 Task 2 SQL基础&#xff1a;查询与排序-select、运算符、聚合分组查询等 Task 3 SQL进阶&#xff1a;复杂查询方法-视图、子查…

网工内推 | 项目经理专场,最高20K*13薪,软考证书优先

01 Trasen 招聘岗位&#xff1a;大项目经理&#xff08;医疗行业/HIS&#xff09; 职责描述&#xff1a; 1.负责项目按计划完成交付并顺利验收结项&#xff1b; 2.参与项目前期预算、评审、方案设计等&#xff1b; 3.负责具体项目实施&#xff0c;制定项目计划、组织项目资源、…

Web网站服务(二)

1、客户机地址限制。 Require all granted&#xff1a;表示允许所有主机访问。 Require all denied&#xff1a;表示拒绝所有主机访问。 Require local&#xff1a;表示仅允许本地主机访问。 Require [not] host <主机名或域名列表>&#xff1a;表示允许或拒绝指定主机或…

Web安全-SQL注入【sqli靶场第11-14关】(三)

★★实战前置声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将其信息做其他用途&#xff0c;由用户承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 0、总体思路 先确认是否可以SQL注入&#xff0…

轻空间助力中国高校实现场馆多功能一体化

中国高校在迎接体育、文艺、学术等多元化需求的同时&#xff0c;面临着场馆设施不足、建设成本高的难题。然而&#xff0c;随着轻空间&#xff08;江苏&#xff09;膜科技有限公司的崭新解决方案的引入&#xff0c;中国高校如苏州大学等正迎来一场场馆多功能一体化的革命。 创新…

电源小白入门学习4——LDO的选择与使用技巧

电源小白入门学习4——LDO的选择与使用技巧 LDO简介LDO工作原理LDO选型LDO并联问题LDO的新发展 上期我们介绍了开关电源系统中一些常见的元器件&#xff0c;这期我们来学习LDO的选择与使用技巧 LDO简介 LDO的全称是低压差线性稳压器&#xff08;Low Drop-Out Linear Regulator…

python的os模块(一)

os 模块提供了非常丰富的方法用来处理文件和目录。常用的方法如下表所示&#xff1a; 一.os.getcwd 相当于shell的 pwd&#xff0c;查看当前目录 [rootrhel8 day06]# vim demo01.py import os print(os.getcwd()) #查看当前目录[rootrhel8 day06]# python3 demo01.py /root/m…

计算机病毒判定专家系统原理与设计《文字提取人工修正》

内容源于网络。网络上流转的版本实在是不易阅读&#xff0c; 又不忍神作被糟蹋故稍作整理&#xff0c;对于内容仍然有识别不准的地方&#xff0c;网友可留言&#xff0c;我跟进修改。 雷 军 &#xff08;武汉大学计算机系&#xff0c;430072) 摘要: 本文详细地描述了…

Rust的未来发展趋势和行业应用

大家好&#xff01;我是lincyang。 今天&#xff0c;我们来深入探讨Rust的未来发展趋势以及它在各个行业中的应用情况。 自从Rust语言问世以来&#xff0c;它以其独特的安全性和高效性在编程界引起了广泛关注。Rust的设计理念主要集中在安全、速度和并发三个方面&#xff0c;…

【数值计算方法(黄明游)】数值积分(一):复化(梯形公式、中点公式)【理论到程序】

​ 文章目录 一、梯形公式、中点公式1. 梯形公式&#xff08;Trapezoidal Rule&#xff09;&#xff1a;2. 复化梯形公式&#xff08;Composite Trapezoidal Rule&#xff09;&#xff1a;3. 中点公式&#xff08;Midpoint Rule&#xff09;&#xff1a;4. 复化中点公式&#…

算法通关村第十五关 | 黄金 | 超大规模数据场景

1.对 20GB 文件进行排序 有一个 20GB 的文件&#xff0c;每行一个字符串&#xff0c;对其进行排序。 这里可以使用分块方式来排序&#xff0c;先将每块进行排序&#xff0c;然后要逐步进行合并&#xff0c;也叫做外部排序。 2.超大文本中搜索两个单词的最短距离 有一个超大…

【UML】NO.2 UML必须了解的基础知识(举例)

目录 一、UML的构成 1.1 事物 1.2 关系 1.3 图 二、事物 2.1 结构事物 2.1.1 类&#xff08;class&#xff09; 2.1.2 接口 2.1.3 协作 2.1.4 用例 2.1.5 主动类 2.1.6 构件 2.1.7 节点 2.2 行为事物 2.2.1 交互 2.2.2 状态机 2.2.3 活动 2.3 分组事物 包 …