帧:一个帧是一个连续的工作单元。当一个js函数被调用时,运行时环境就会在栈中创建一个帧。帧里保存了特殊的函数参数和局部变量。当函数返回时,帧就被从栈中推出。例如:

function foo(b) {
var a = 10;
return a + b + 6;
}
function bar(x) {
var c = 4;
return foo(c * x);
}

在声明了foo和bar函数后,执行bar函数

bar(20)

当bar被执行时,运行时将会创建一个包含bar 的参数和所有局部变量的帧。这个帧被添加到了栈的顶部。

bar函数在内部调用了foo的函数,当foo函数被调用时,栈的顶部就又创建了一个新的帧。当foo函数执行完毕后,栈顶部对应的帧就被移除。当bar函数执行完毕后,相应的帧同样被移除。

如果foo函数中又调用了bar函数,那么就创建了一个无限循环的函数调用,就会导致栈被填满最后抛出错误。

栈:栈包含了一个信息在执行时的所有步骤(帧)。栈的数据结构为“后进先出”,因此当一个帧被加入到一个栈中时,它总是被添加到最上面,事件循环会从上至下地处理栈中的帧。

队列:

队列中包含一个待执行信息的列表,每一个信息都与一个函数相互联系。当栈为空时,队列中的一条信息就会被取出并处理。处理过程为调用该信息所关联的函数,然后将此帧添加到栈的顶部。当栈在此为空时,本次信息处理视为结束。

堆:

堆是一个内存存储空间,它不关注内部储存的内容的保存顺序,堆中保存了所有正在被使用的变量和对象。同时也保存了一些当前作用域已经不会再被用的但还没被垃圾回收机制回收的帧。

事件循环:

事件循环内的信息是线性执行的,这意味着它接收到一个信息后,在处理完毕之前,不会再处理其他任何信息。如果栈是空的,那么函数就会立刻执行。当所有的帧被加入栈中后,栈便开始从上至下清除这些帧。最后,栈会被清空,然后下一个信息将会被处理。

理解js运行时的一些概念的更多相关文章

  1. 第28 章 : 理解容器运行时接口 CRI

    理解容器运行时接口 CRI CRI 是 Kubernetes 体系中跟容器打交道的一个非常重要的部分.本文将主要分享以下三方面的内容: CRI 介绍 CRI 实现 相关工具 CRI 介绍 在 CRI ...

  2. js异步梳理:1.从浏览器的多进程到JS的单线程,理解JS运行机制

    大家很早就知道JS是一门单线程的语言.但是也时不时的会看到进程这个词.首先简单区分下线程和进程的概念 1. 简单理解进程 - 进程是一个工厂,工厂有它的独立资源 - 工厂之间相互独立 - 线程是工厂中 ...

  3. 如何通过setTimeout理解JS运行机制详解

    setTimeout()函数:用来指定某个函数或某段代码在多少毫秒之后执行.它返回一个整数,表示定时器timer的编号,可以用来取消该定时器. 例子 ? 1 2 3 4 5 console.log(1 ...

  4. 一个“Hello World”理解JVM运行时数据区

    先上一张JVM体系结构图: 1)运行时数据区:经过编译生成的字节码文件(class文件),由class loader(类加载子系统)加载后交给执行引擎执行.在执行引擎执行的过程中产生的数据会存储在一块 ...

  5. 深入理解Java虚拟机(一) 运行时数据区划分

    前言:从我学Java的第一天开始,我的大学老师就告诉我 Java语言相比C.C++的语言有一个非常强大的功能,那就是自动内存管理:我们用Java编码时不需要申请或释放内存等,这些工作全部交由我们的Ja ...

  6. 由objC运行时所想到的。。。

    objC语言不仅仅有着面向对象的特点(封装,继承和多态),也拥有类似脚本语言的灵活(运行时),这让objC有着很多奇特的功能-可在运行时添加给类或对象添加方法,甚至可以添加类方法,甚至可以动态创建类. ...

  7. JS运行机制之 Event Loop 的思考

    先举个栗子,如下: for (var i = 0; i < 5; i++) { setTimeout(function() { console.log('i: ',i); //一秒之后输出几乎没 ...

  8. 【转】Java运行时数据区简介及堆与栈的区别

    理解JVM运行时的数据区是Java编程中的进阶部分.我们在开发中都遇到过一个很头疼的问题就是OutOfMemoryError(内存溢出错误),但是如果我们了解JVM的内部实现和其运行时的数据区的工作机 ...

  9. JVM——内存区域:运行时数据区域详解

    关注微信公众号:CodingTechWork,一起学习进步. 引言   我们经常会被问到一个问题是Java和C++有何区别?我们除了能回答一个是面向对象.一个是面向过程编程以外,我们还会从底层内存管理 ...

随机推荐

  1. QT从入门到入土(三)——信号和槽机制

    摘要 信号槽是 Qt 框架引以为豪的机制之一.所谓信号槽,实际就是观察者模式.当某个事件发生之后,比如,按钮检测到自己被点击了一下,它就会发出一个信号 (signal).这种发出是没有目的的,类似广播 ...

  2. Luogu P4313 文理分科

    link 最小割 双倍经验 这道题运用了最小割最常用的一种用法:集合划分. 因为源汇最小割即就是将源汇划分到不同的集合,那么最简单的应用就是最小代价划分集合了. 本题中,题意是将 \(n\cdot m ...

  3. python 10篇 操作mysql

    一.操作数据库 使用pip install pymysql,安装pymysql模块,使用此模块连接MySQL数据库并操作数据库. import pymysql host = 'ip地址' # 链接的主 ...

  4. TOSCA自动化测试工具

    TOSCA由德国公司Tricentis研发,提供英文和德语两种版本. 目前他们的网上培训课程大约是2000一套,从初级到高级,从工程师到BA,有技术,也有测试管理. TOSCA的思想是,不用会编程的测 ...

  5. python_字典列表嵌套的排序问题

    上一篇我们聊到python 字典和列表嵌套用法,这次我们聊聊字典和列表嵌套中的排序问题,这个在python基础中不会提到,但实际经常运用,面试中也喜欢问,我们娓娓道来. 在说组合排序之前,先来看看排序 ...

  6. Java8 DateTime API

    Java 8的日期/时间API,有篇不错的文章,直接转载 原文链接: journaldev 翻译: ImportNew.com- Justin Wu译文链接: http://www.importnew ...

  7. Spring RestTemplate 之中文乱码

    由于RestTemplate的默认构造方法初始化的StringHttpMessageConverter的默认字符集是ISO-8859-1,所以导致RestTemplate请求的响应内容会出现中文乱码. ...

  8. Unittest方法 -- 测试断言

    """断言详解"""from unittest_1.it import *def add(a,b): return a - bclass B ...

  9. Unittest方法 -- 用例执行顺序

    import unittestfrom selenium import webdriverclass F4(unittest.TestCase): @classmethod def setUpClas ...

  10. 【LeetCode】145. 二叉树的后序遍历

    145. 二叉树的后序遍历 知识点:二叉树:递归:Morris遍历 题目描述 给定一个二叉树的根节点 root ,返回它的 后序 遍历. 示例 输入: [1,null,2,3] 1 \ 2 / 3 输 ...