目录

一、为什么 JavaScript 是单线程?

二、JavaScript是单线程,怎样执行异步的代码?

三、事件循环机制

四、代码1

五、结果1

六、代码2

七、结果2


一、为什么 JavaScript 是单线程?

JavaScript 语言的一大特点就是单线程,也就是说,同一个时间只能做一件事。那么,为什么JavaScript 不能有多个线程呢 ?这样能提高效率啊。

JavaScript 的单线程,与它的用途有关。作为浏览器脚本语言,JavaScript 的主要用途是与用户互动,以及操作 DOM。这决定了它只能是单线程,否则会带来很复杂的同步问题。比如,假定JavaScript 同时有两个线程,一个线程在某个 DOM 节点上添加内容,另一个线程删除了这个节点,这时浏览器应该以哪个线程为准?

所以,为了避免复杂性,从一诞生,JavaScript 就是单线程,这已经成了这门语言的核心特征,将来也不会改变。

二、JavaScript是单线程,怎样执行异步的代码?

单线程就意味着,所有任务需要排队,前一个任务结束,才会执行后一个任务。如果前一个任务耗时很长,后一个任务就不得不一直等着。消息队列:消息队列是一个先进先出的队列,它里面存放着各种消息。事件循环:事件循环是指主线程重复从消息队列中取消息、执行的过程。实际上,主线程只会做一件事情,就是从消息队列里面取消息、执行消息,再取消息、再执行。当消息队列为空时,就会等待直到消息队列变成非空。而且主线程只有在将当前的消息执行完成后,才会去取下一个消息。这种机制就叫做事件循环机制,取一个消息并执行的过程叫做一次循环。

三、事件循环机制

上图大致描述就是:

  • 主线程运行时会产生执行栈,栈中的代码调用某些 api 时,它们会在事件队列中添加各种事件(当满足触发条件后,如 setTimeout 执行完毕)
  • 而栈中的代码执行完毕,就会读取事件队列中的事件,去执行那些回调
  • 如此循环

注意,总是要等待栈中的代码执行完毕后才会去读取事件队列中的事件

四、代码1

//打印5次   值:5
for(var i=0;i<5;i++){setTimeout(function(){console.log(i);},1000)}

五、结果1

六、代码2

//几秒输出几?for(var i=0;i<3;i++){setTimeout(function(){console.log(i);},1000*i);}

七、结果2

前端小知识点(3):JavaScript 单线程相关推荐

  1. 前端开发技术-剖析JavaScript单线程

    JavaScript单线程和多线程是很多小白同学入门的时候问到最多的问题,虽然官方给出过解释但对于新手来说并不友好,今天小千就来给大家介绍一下JavaScript的单线程. 一. 浏览器的进程和线程 ...

  2. 前端小知识点(4):JS 运行机制和存储

    目录 被忽视的内存管理 JS工作原理 JS代码如何运行 JavaScript内存的生命周期 栈内存.堆内存 代码案例 运行结果 被忽视的内存管理 JavaScript不像C.C++等语言--程序员必须 ...

  3. 前端小知识点(8):作者为什么设计原型

    目录 一.从古代说起 二.Brendan Eich的选择 三.new运算符的缺点 四.prototype属性的引入 五.总结 六代码部分 一.从古代说起 要理解Javascript的设计思想,必须从它 ...

  4. 前端小知识点(1):undefined和null区别

    目录 一.奇怪点 二.历史原因 三.具体区别 四.代码演示 五.运行结果 一.奇怪点 有点奇怪的是,JavaScript语言居然有两个表示"无"的值:undefined和null. ...

  5. 前端面试知识点总结JavaScript基础之原型和原型链(二)

    一.JavaScript基础 原型和原型链 1.理解原型设计模式以及JavaScript中的原型规则 设计模式 1.工厂模式:在函数内建立一个对象,给对象赋予属性及方法再将对象返回设计模式. func ...

  6. 前端小技巧:javascript 获取标签中的属性 对指定标签中的属性进行操作

    javascript 标签中指定属性值的更改与获取 适用于基本标签 <input><i><a>等基本标签 引用jQuery,两种方式 使用下面的input标签为例子 ...

  7. 【转载】前端小知识点---html换行被解析为空格的相关知识

    html换行被解析为空格也是常说的3像素空隙的问题,根据测试不同浏览器产生的空隙大小会不一样,Chrome,Firefox,IE8+都存在这样的问题,这个问题的原因相比大家都知道,浏览器把换行解析成了 ...

  8. 前端小知识点(10):原型链

    目录 原型链 : 代码1 运行结果1 代码二 运行结果2 原型链 : 每一个对象都有一个原型(__proto__),这个原型还可以拥有自己的原型,形成最终的原型链. 查找一个对象特定的属性或者方法,我 ...

  9. 前端小知识点(9):函数和对象之间的关系

    目录 函数与对象之间的关系 代码演示 运行结果 函数与对象之间的关系 函数 有什么 : 函数也是对象          函数有:prototype 对象 有什么 对象:__proto__ 原型对象里面 ...

最新文章

  1. php源码之计算两个文件的相对路径
  2. BugKuCTF WEB web4
  3. 优雅的使用 PhpStorm 来开发 Laravel 项目
  4. CLIENT系列、OFFSET系列、SCROLL系列
  5. java lucene cms_JEECMSv6标签使用之[@cms_lucene_list]
  6. 如何优雅地过滤敏感词
  7. Struts1与Struts2原理 区别 详解 汇总
  8. android获取路由器ip地址吗,查看路由器IP地址方法(管理后台地址)
  9. ITEXT PDF文件的拆分与合并
  10. 力天创见客流统计分析系统
  11. 将制作好的系统启动U盘还原
  12. VScode配置C/C++环境(适合大学生C++课程,从零开始配置)
  13. 下载Gazebo模型
  14. 宋宝华: 关于DMA ZONE和dma alloc coherent若干误解的彻底澄清
  15. 双轴反作用轮定点自平衡杆动力学模型
  16. 微软office365服务器地址,由世纪互联运营的 Office 365 的 URL 和 IP 地址范围
  17. 基于云开发的智慧校园小程序的设计与实现
  18. 51单片机小项目--超声波避障小车
  19. Flarum 源码安装错误
  20. pushmail的一点总结

热门文章

  1. java判断题_【Java判断题】请大神们进来看下、这些判断题你都知道多少~
  2. 为什么Java里面的静态方法不能是抽象的
  3. react本地储存_如何使用React和本地存储构建freeCodeCamp的配方框
  4. react 组件引用组件_React Elements VS React组件
  5. python 数据框缺失值_Python:处理数据框中的缺失值
  6. 【iOS - 周总结】开发中遇到的小知识点(2018.12.10-2018.12.15)
  7. 重构 改善既有代码的设计:代码的坏
  8. 删除Autorun.inf的方法
  9. 英语磁带与计算机磁带区别,小学教材仍配发英语磁带遭吐槽:谁还用录音机
  10. dll oem证书导入工具_技术干货 | 恶意代码分析之反射型DLL注入