Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >JavaScript 是如何工作的🔥 🤖 [视觉解释]

JavaScript 是如何工作的🔥 🤖 [视觉解释]

作者头像
玖柒的小窝
修改于 2021-09-13 03:28:19
修改于 2021-09-13 03:28:19
2.7K00
代码可运行
举报
文章被收录于专栏:各类技术文章~各类技术文章~
运行总次数:0
代码可运行

JavaScript 是世界上最受欢迎和最讨厌的语言之一。它被爱,因为它是有效的。您只需学习 JavaScript 即可制作全栈应用程序。它也被讨厌,因为它以出乎意料和令人不安的方式行事,如果您不投入理解该语言,可能会让您讨厌它💔。

这篇博客将解释 JavaScript 如何在浏览器中执行代码,我们将通过动画 gif 来学习它😆。看完这篇博文,你离成为Rockstar开发者又近了一步🎸😎

执行上下文

JavaScript 中的一切都发生在一个执行上下文中。”

我希望每个人都记住这句话,因为它是必不可少的。你可以假设这个执行上下文是一个大容器,当浏览器想要运行一些 JavaScript 代码时调用。

在这个容器中,有两个组件 1. 内存组件 2. 代码组件

内存组件也称为变量环境。在这个内存组件中,变量和函数被存储为键值对。

代码组件是容器中一次执行一行代码的地方。这个代码组件还有一个奇特的名字,即“执行线程”。我觉得听起来很酷!

JavaScript 是一种同步的单线程语言。这是因为它一次只能以特定的顺序执行一个命令。

代码的执行

举个简单的例子,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var a = 2;
var b = 4;

var sum = a + b;

console.log(sum);

在这个简单的例子中,我们初始化了两个变量 a 和 b 并分别存储了 2 和 4。

然后我们将ab的值相加并将其存储在sum变量中。

让我们看看 JavaScript 将如何在浏览器中执行代码🤖

浏览器创建一个具有两个组件的全局执行上下文,即内存和代码组件。

浏览器将分两阶段执行 JavaScript 代码

1> 内存创建阶段

2> 代码执行阶段

在内存创建阶段,JavaScript 会扫描所有代码,并为代码中的所有变量和函数分配内存。对于变量,JavaScript 将在内存创建阶段存储 undefined,对于函数,它将保留整个函数代码,我们将在下面的示例中查看。

现在,在第二阶段,即代码执行,它开始逐行遍历整个代码。

当它遇到var a = 2 时,它将 2 分配给内存中的 'a'。到目前为止,'a' 的值是未定义的。

同样,它对 b 变量也做同样的事情。它将 4 分配给 'b'。然后它计算总和的值并将其存储在内存中,即 6。现在,在最后一步,它在控制台中打印总和值,然后在我们的代码完成时销毁全局执行上下文。

如何在执行上下文中调用函数?

JavaScript 中的函数与其他编程语言相比,工作方式有所不同。

举个简单的例子,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var n = 2;

function square(num) {
 var ans = num * num;
 return ans;
}

var square2 = square(n);
var square4 = square(4);

上面的例子有一个函数,它接受一个 number 类型的参数并返回数字的平方。

JavaScript 会在我们运行代码的第一阶段创建一个全局执行上下文并为所有变量和函数分配内存,如下所示。

对于函数,它会将整个函数存储在内存中。

激动人心的部分来了,当 JavaScript 运行函数时,它会在全局执行上下文中创建一个执行上下文。

当它遇到 var a = 2 时,它将 2 分配给内存中的“n”。第2行是一个函数,由于函数在内存执行阶段已经分配了内存,所以会直接跳转到第6行。

square2 变量将调用 square 函数,javascript 将创建一个新的执行上下文。

square 函数的这个新执行上下文将在内存创建阶段为函数中存在的所有变量分配内存。

为函数内部的所有变量分配内存后,它将一行一行地执行代码。它将获得 num 的值,该值等于第一个变量的 2,然后计算 ans。计算完 ans 后,它将返回将分配给 square2 的值。

一旦函数返回值,它将在完成工作时销毁其执行上下文。

现在它将对第 7 行或 square4 变量执行类似的过程,如下所示。

一旦所有代码执行完毕,全局执行上下文也将被销毁,这就是 JavaScript 在幕后执行代码的方式。

调用栈

当在 JavaScript 中调用一个函数时,JavaScript 会创建一个执行上下文。当我们将函数嵌套在函数中时,执行上下文会变得复杂。

JavaScript 在 Call Stack 的帮助下管理代码执行上下文的创建和删除。

堆栈(有时称为“下推堆栈”)是项目的有序集合,其中新项目的添加和现有项目的删除总是发生在同一端,例如。一叠书。

调用堆栈是一种在调用多个函数的脚本中跟踪其位置的机制。

让我们举个例子

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function a() {
    function insideA() {
        return true;
    }
    insideA();
}
a();

我们正在创建一个函数 'a',它调用另一个返回 true 的函数 'insideA'。我知道代码很笨,没有做任何事情,但它会帮助我们理解 JavaScript 如何处理回调函数。

JavaScript 将创建一个全局执行上下文。全局执行上下文将在代码执行阶段为函数“a”分配内存并调用“函数a”。

为函数 a 创建了一个执行上下文,它位于调用堆栈中的全局执行上下文之上。

函数 a将分配内存并调用函数insideA。函数 insideA创建一个执行上下文,并将其放置在“函数 a”的调用堆栈之上。

现在,这个 insideA 函数将返回 true 并将从调用堆栈中删除。

由于“function a”执行上下文中没有代码,因此将从调用堆栈中删除。

最后,全局执行上下文也从调用堆栈中删除。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系外文翻译,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
JavaScript 执行线程图解
这是研究 JavaScript 内部工作方式的系列文章的第一篇。我会尽力使它变得有趣,并且不让你感到厌烦,因为我知道这些东西有时会变得非常乏味!
4O4
2022/04/25
4890
JavaScript 执行线程图解
手把手教会你JavaScript引擎如何执行JavaScript代码
JavaScript 在运行过程中与其他语言有所不一样,如果不理解 JavaScript 的词法环境、执行上下文等内容,很容易会在开发过程中产生 Bug,比如this指向和预期不一致、某个变量不知道为什么被改了,等等。所以今天我们就来聊一聊 JavaScript 代码的运行过程。
前端皮皮
2022/08/17
4620
手把手教会你JavaScript引擎如何执行JavaScript代码
JavaScript引擎相关名词
JS引擎的一些事 JS引擎 一个读取代码并运行的引擎,没有单一的"JS引擎"; 每个浏览器都有自己的引擎,流行的引擎项目: V8 开源,由 Google 开发,用 C ++ 编写 Rhino 由 Mozilla 基金会管理,开源,完全用 Java 开发 SpiderMonkey 第一个支持 Netscape Navigator 的 JavaScript 引擎,目前正供 Firefox 使用 JavaScriptCore 开源,以Nitro形式销售,由苹果为Safari开发 KJS KDE的引擎
薛定喵君
2019/11/06
5820
javascript入门到进阶 - js系列六:执行上下文
javascript代码在执行时,会进入一个执行上下文中,执行上下文可以理解为当前代码的运行环境。
公众号---人生代码
2020/07/16
4940
javascript入门到进阶 - js系列六:执行上下文
JS执行上下文的两个阶段做了些啥?
每个web浏览器都有自己的JS引擎形式,尽管目的一样。Chrome 有 v8, Mozilla 有 spider monkey等,JS引擎只是将JS源代码转换成编译器能够理解的语言,然后执行它。
前端小智@大迁世界
2020/06/24
7040
JS执行上下文的两个阶段做了些啥?
搞懂JavaScript引擎运行原理
JS引擎 — 一个读取代码并运行的引擎,没有单一的“JS引擎”;,每个浏览器都有自己的引擎,如谷歌有V。
前端小智@大迁世界
2019/07/02
8950
深入浅出 JavaScript 弱引用
内存和性能管理是软件开发的重要方面,也是每个软件开发人员都应该注意的方面。虽然弱引用很有用,但在 JavaScript 中并不经常使用。在 ES6 版本中,JavaScript 引入了 WeakSet 和 WeakMap。
用户8921923
2022/10/24
8400
JavaScript 执行线程图解
这是研究 JavaScript 内部工作方式的系列文章的第一篇。我会尽力使它变得有趣,并且不让你感到厌烦,因为我知道这些东西有时会变得非常乏味!
疯狂的技术宅
2020/03/16
7460
JavaScript 执行线程图解
(ES5版)深入理解 JavaScript 执行上下文和执行栈
最近在研究 JavaScript 基础性的东西,但是看到对于执行上下文的解释我发现有两种,一种是执行上下文包含:scope(作用域)、variable object(变量对象)、this value(this 值),另外一个种是包含:lexical environment(词法环境)、variable environment(变量环境)、this value(this 值)。
桃翁
2020/03/25
9590
(ES5版)深入理解 JavaScript 执行上下文和执行栈
JS到底是怎么执行的:一文彻底搞清执行上下文
所有JavaScript代码都需要在某种环境中托管和运行。在大多数情况下,这种环境是一个web浏览器。
前端修罗场
2022/07/29
1.5K0
JS到底是怎么执行的:一文彻底搞清执行上下文
JS执行上下文与调用栈
本文分享 了 JavaScript 基础的两个方面:执行上下文和调用堆栈。每当 JavaScript 代码运行时,它都在执行上下文中运行;调用栈则可以在脚本调用多个函数时,跟踪每个函数在完成执行时应该返回的控制点。
前端开发博客
2020/11/04
1.6K0
「查缺补漏」JavaScript执行上下文-执行栈
突然觉得对于一名JavaScript开发者而言,需要知道JavaScript程序内部是如何运行的,那么对于此章节执行上下文和执行栈的理解很重要,对理解其他JavaScript概念(变量声明提示,作用域和闭包)都有帮助。
前端老王
2020/09/28
5890
「查缺补漏」JavaScript执行上下文-执行栈
深入理解JavaScript作用域
在上一篇文章 深入理解JavaScript 执行上下文 中提到 只有理解了执行上下文,才能更好地理解 JavaScript 语言本身,比如变量提升,作用域,闭包等,本篇文章就来说一下 JavaScript 的作用域。
木子星兮
2020/07/27
7190
深入理解JavaScript作用域
JAVASCRIPT FUNCTIONS 详解
本文是@堂主 对《Pro JavaScript with Mootools》一书的第二章函数部分知识点讲解的翻译。该书的作者 Mark Joseph Obcena 是 Mootools 库的作者和目前开发团队的 Leader。虽然本篇文章实际译于 2012 年初,但个人感觉这部分对 Javascript 函数的基本知识、内部机制及 JavaScript 解析器的运行机制讲的非常明白,脉络也清楚,对初学者掌握 JavaScript 函数基础知识很有好处。尤其难得的是不同于其他 JavaScript书籍讲述的都是分散的知识点,这本书的知识讲解是有清晰脉络的,循序渐进。换句话说,这本书中的 JavaScript 知识是串起来的。
政采云前端团队
2019/12/20
7520
JavaScript如何工作:内存管理+如何处理4个常见的内存泄漏
本中,我们将讨论另一个重要主题——内存管理,这是由于日常使用的编程语言越来越成熟和复杂,开发人员容易忽视这一问题。我们还将提供一些有关如何处理JavaScript中的内存泄漏的技巧,在SessionStack中遵循这些技巧,既能确保SessionStack 不会导致内存泄漏,也不会增加我们集成的Web应用程序的内存消耗。
Javanx
2019/10/09
1.1K0
JavaScript如何工作:内存管理+如何处理4个常见的内存泄漏
万字干货!详解JavaScript执行过程
栈的特点是"LIFO,即后进先出(Last in, first out)"。数据存储时只能从顶部逐个存入,取出时也需从顶部逐个取出。
童欧巴
2021/08/20
1.1K0
万字干货!详解JavaScript执行过程
JavaScript 中 10 个需要掌握基础的问题
JavaScript 是一种客户端编程语言。 全球超过90%的网站都在使用它,它是世界上最常用的编程语言之一。 因此,今天我们业讨论 10 个有关 JavaScript 的常见问题。
前端小智@大迁世界
2020/10/23
2.8K0
2022秋招前端面试题(二)(附答案)
UDP在传输数据之前不需要先建立连接,远地主机的运输层在接收到UDP报文后,不需要确认,提供不可靠交付。总结就以下四点:
helloworld1024
2022/08/06
4460
前端冲刺必备指南-执行上下文/作用域链/闭包/一等公民
前言 大家好,我是吒儿?,每天努力一点点?,就能升职加薪?当上总经理出任CEO迎娶白富美走上人生巅峰?,想想还有点小激动呢?。 这是我的第11期文章内容✍,我并不希望把?这篇文章内容成为笔记去记,或者
达达前端
2020/05/20
8480
从 JavaScript 作用域说开去
在电脑程序设计中,作用域(scope,或译作有效范围)是名字(name)与实体(entity)的绑定(binding)保持有效的那部分计算机程序。不同的编程语言可能有不同的作用域和名字解析。而同一语言内也可能存在多种作用域,随实体的类型变化而不同。作用域类别影响变量的绑定方式,根据语言使用静态作用域还是动态作用域变量的取值可能会有不同的结果。
一缕殇流化隐半边冰霜
2018/08/29
8850
从 JavaScript 作用域说开去
相关推荐
JavaScript 执行线程图解
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档