概览

几乎所有人都已经听说了V8引擎的概念,大多数人都知道JavaScript是单线程运行的或者说是使用回调队列的。

接下来,我们将详细的讲述这些概念,解释JavaScript到底是怎样运行的。当知道了这些细节后,你就能合理利用已有的API写出更好的,非阻塞的应用。 如果你是JavaScript新手,这篇博客可以帮助你理解为什么相对于其他语言,JavaScript显得如此奇怪。

如果你是比较有经验的JavaScript开发者,希望这篇博客可以让你对你每天使用的JavaScript运行时到底是怎样运行的有一些新的见解。

JavaScript引擎

一个流行的JavaScript引擎是谷歌的V8引擎。例如在Chrome和Node.js中使用的就是V8引擎。下图是V8引擎一个非常简单的预览:

V8引擎由两个主要组件所组成:

  • Memory Heap--内存分配区

  • Call Stack--代码运行时栈

运行时

大部分JavaScript开发者都使用过浏览器的API(例如“setTimeout”)。然而这些API都不是由引擎提供的。 那么,它们来自哪里呢? 真实情况有点复杂。

所以除了引擎还有喝很多其他的东西。有浏览器提供的Web API,像DOM,AJAX,setTimeout等等。 然后还有非常有名的event loop和call queue。

调用栈

JavaScript是一门单线程的编程语言,也就是说它只有一个调用栈,因此它只能一次做一件事。

调用栈是一个记录程序运行到哪里的数据结构。调用函数的时候,我们会把它放到栈的最顶部。从函数返回的时候,我们会把它从栈的最顶部弹出来。这就是调用栈做的所有的事情。

我们来看一个例子,看一下如下代码:

function multiply(x, y) {return x * y;
}
function printSquare(x) {var s = multiply(x, x);console.log(s);
}
printSquare(5);
复制代码

当引擎开始执行这段代码的时候,调用栈是空的。接下来,每一步如下所示:

每次进入调用栈成为栈桢。 这就是当一个异常抛出时,栈的记录是怎样组成的,基本上就是当一个异常发生的时候调用栈的状态。看一下如下代码:

function foo() {throw new Error('SessionStack will help you resolve crashes :)');
}
function bar() {foo();
}
function start() {bar();
}
start();
复制代码

如果是运行在Chrome中(假定这段代码在foo.js文件中),将会生成如下栈记录:

“栈溢出”--这个发生在超过调用栈最大空间的时后。这非常容易发生,特别是当你使用递归但又没有非常严格的测试你的代码的时候。看一下如下代码示例:

function foo() {foo();
}
foo();
复制代码

当引擎开始执行这段代码的时候,首先调用“foo”函数,但是这个函数是递归的,开始调用自己并且没有结束条件。所以每一步执行,相同的函数都会一遍又一遍的加入到调用栈中,看上去就像这样:

然而在某个时间点上调用栈中的函数调用数量将会超过调用栈的实际大小,此时浏览器决定采取行动,抛出一个错误,我们就会看到像下面这样的提示:

在单线程上运行代码是非常容易的,你不用处理在多线程中发生的复杂的场景--例如死锁。

Concurrency & the Event Loop

在调用栈中存在需要花费很多时间的函数调用时会发生什么呢?例如,想象一下你需要在浏览器中利用JavaScript来做一些复杂的图片转换。

你可能会问--这有什么好问的?问题就是调用栈在执行函数的时候,浏览器不能做其他的事--浏览器被阻塞了。这意味着浏览器将不能渲染,不能运行其他代码,就是说被阻塞了。如果你想要一个体验很好,运行流畅的应用,这将会是很大的问题。

而且还不止这一个问题。一旦你的浏览器在调用栈中处理很多任务,它将会在很长时间内得不到响应,大多数浏览器将会抛出一个错误来采取行动,询问你是否要结束这个web页面。

这不是最好的用户体验,不是吗?

所以,我们怎样才能在运行很重的代码的时候,不阻塞UI,使浏览器不需要等待响应呢?解决方案就是异步回调。

我们将会在下一节详细讲述。

对V8引擎的内部机制感兴趣的同学可以看这里。

本文翻译自:blog.sessionstack.com/how-does-ja…

JS引擎、运行时与调用栈概述相关推荐

  1. 只调用一次_JavaScript运行机制 - 调用栈

    背景 如果你试图运行下面的代码: function func(){func() }func() 相信你会得到如下的结果 调用栈是用来管理函数调用关系的一种数据结构.让我们先来看看函数调用和栈结构. 函 ...

  2. 前端读者 | 由setTimeout引发的JS引擎运行机制的研究

    本文来自 @xiaoyuze88 链接:http://xiaoyuze88.github.io/ 太久没碰代码了,那天想到关于循环调用setTimeout实现每隔一秒输出递增的数的那个问题,搞了搞,发 ...

  3. JavaScript是如何工作的:引擎,运行时间以及调用栈的概述

    JavaScript是如何工作的:引擎,运行时以及调用栈的概述 原文:How JavaScript works: an overview of the engine, the runtime, and ...

  4. JVM学习笔记之-运行时数据区概述及线程概述,程序计数器(PC寄存器),虚拟机栈(栈,局部变量表,操作数栈,动态连接,方法调用,方法返回地址等),本地方法接口,本地方法栈

    运行时数据区概述及线程概述 内存是非常重要的系统资源,是硬盘和CPU的中间仓库及桥梁,承载着操作系统和应用程序的实时运行.JVM内存布局规定了Java在运行过程中内存申请.分配.管理的策略,保证了JV ...

  5. 【JVM】运行时数据区概述(程序计数器、虚拟机栈、本地方法栈)

    前言 本节主要讲的是运行时数据区,也就是下图这部分,它是在类加载完成后的阶段 当我们通过前面的:类的加载-> 验证 -> 准备 -> 解析 -> 初始化 这几个阶段完成后,就会 ...

  6. JS逆向--PyExecJS基本用法--网易云音乐逆向思路,node.js安装教程,逆向思路,逆向分析,加密机制,RSA,AES加密算法,加密算法啊破解,js引擎,定位数据包,分析栈结构,无痕窗口

    文章目录 前言 一.JS逆向以及PyExecJS模块介绍 1.JS逆向 2.PyEecJS 二.使用步骤 1.环境安装 安装PyExecJS模块 安装node.js开发环境(官网链接 https:// ...

  7. java rhino import_java调用javascript :js引擎rhino

    前段时间,在浏览javaeye论坛,看见有人征集如何在java中运行数学表达式. 结果方案五花八门: 1.jakarta commons JEXL. 2.Beanshell 3.Java Math E ...

  8. js进栈出栈_JavaScript调用栈

    1:基本概念 栈(stack):用来保存简单的数据字段. 堆(heap):用来保存栈中简单的数据字段对指针的引用. 队列:是一种先进先出的线性数据结构.函数的调用的进栈和出栈的顺序,遵循 先进后出 的 ...

  9. js版palppy brid代码_从 JS 引擎到 JS 运行时(上)

    V8 和 Node.js 的关系,是许多前端同学们所津津乐道的--浏览器里的语言,又兼容了浏览器外的环境,两份快乐重叠在一起.而这两份快乐,又带来了更多的快乐--但你有没有想过,这两份快乐到底是如何重 ...

最新文章

  1. 耗时3天,上亿数据如何做到秒级查询?
  2. python升级或者其他原因把yum搞坏了
  3. TCP 三次握手四次挥手
  4. 登录页面跳出框架的JS
  5. 中文整合包_MIMOSA2: 基于微生物组和代谢组数据的整合分析
  6. tensorflow提取mel谱特征_【脑电信号分类】脑电信号提取PSD功率谱密度特征
  7. win7家庭版安装oracle,win7 home 版安装 Oracle 10g
  8. Redis数据结构——字典-hashtable
  9. vue 中 computed 计算属性 的用法
  10. html得到上传文件类型后缀,js获取上传文件后缀名(附js提交form表单)
  11. 一些实用但不为人知的Unix命令
  12. 树莓派安装OpenCV - 亲测可用
  13. 让IE中的IFrame透明
  14. linux 队列缓冲,linux驱动的等待队列(阻塞操作)和轮询(poll),缓冲区笔记
  15. 橡胶支座抗压弹性模量计算公式_橡胶支座计算
  16. 深圳赛意信息 怎么样_深圳鹏程整形医院怎么样_全新整形价目表_资质
  17. 谈谈前端浏览器兼容和性能优化
  18. C语言:各种数据类型转换函数
  19. 题库来源:安全生产模拟考试一点通公众号小程序 安全生产模拟考试一点通:2021年焊工(初级)考试资料为正在备考焊工(初级)操作证的学员准备的理论考试专题,每个月更新的焊工(初级)免费试题祝您顺利通过
  20. 应用层协议 —— HTTP(二)

热门文章

  1. python写word模板_Python3操作Office之Word模板技术
  2. python训练手势分类器_使用Pytorch训练分类器详解(附python演练)
  3. 南京信息工程大学c语言实验十报告,南京信息工程大学2014年C语言程序设计实验内容(全部).doc...
  4. python中的字典推导式_17.python 字典推导式(经典代码)
  5. 多源信息融合_华测导航王超:基于RTK的GNSS与多源融合定位技术和挑战
  6. WPF自定义命令(转)
  7. flask框架(十): 闪现
  8. XVIII Open Cup named after E.V. Pankratiev. GP of Urals
  9. FLEX:使用setTimeout,setInterval ,实现sleep功能(转)
  10. C#中DataGridView控件使用大全