前端小知识点(3):JavaScript 单线程
目录
一、为什么 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 单线程相关推荐
- 前端开发技术-剖析JavaScript单线程
JavaScript单线程和多线程是很多小白同学入门的时候问到最多的问题,虽然官方给出过解释但对于新手来说并不友好,今天小千就来给大家介绍一下JavaScript的单线程. 一. 浏览器的进程和线程 ...
- 前端小知识点(4):JS 运行机制和存储
目录 被忽视的内存管理 JS工作原理 JS代码如何运行 JavaScript内存的生命周期 栈内存.堆内存 代码案例 运行结果 被忽视的内存管理 JavaScript不像C.C++等语言--程序员必须 ...
- 前端小知识点(8):作者为什么设计原型
目录 一.从古代说起 二.Brendan Eich的选择 三.new运算符的缺点 四.prototype属性的引入 五.总结 六代码部分 一.从古代说起 要理解Javascript的设计思想,必须从它 ...
- 前端小知识点(1):undefined和null区别
目录 一.奇怪点 二.历史原因 三.具体区别 四.代码演示 五.运行结果 一.奇怪点 有点奇怪的是,JavaScript语言居然有两个表示"无"的值:undefined和null. ...
- 前端面试知识点总结JavaScript基础之原型和原型链(二)
一.JavaScript基础 原型和原型链 1.理解原型设计模式以及JavaScript中的原型规则 设计模式 1.工厂模式:在函数内建立一个对象,给对象赋予属性及方法再将对象返回设计模式. func ...
- 前端小技巧:javascript 获取标签中的属性 对指定标签中的属性进行操作
javascript 标签中指定属性值的更改与获取 适用于基本标签 <input><i><a>等基本标签 引用jQuery,两种方式 使用下面的input标签为例子 ...
- 【转载】前端小知识点---html换行被解析为空格的相关知识
html换行被解析为空格也是常说的3像素空隙的问题,根据测试不同浏览器产生的空隙大小会不一样,Chrome,Firefox,IE8+都存在这样的问题,这个问题的原因相比大家都知道,浏览器把换行解析成了 ...
- 前端小知识点(10):原型链
目录 原型链 : 代码1 运行结果1 代码二 运行结果2 原型链 : 每一个对象都有一个原型(__proto__),这个原型还可以拥有自己的原型,形成最终的原型链. 查找一个对象特定的属性或者方法,我 ...
- 前端小知识点(9):函数和对象之间的关系
目录 函数与对象之间的关系 代码演示 运行结果 函数与对象之间的关系 函数 有什么 : 函数也是对象 函数有:prototype 对象 有什么 对象:__proto__ 原型对象里面 ...
最新文章
- php源码之计算两个文件的相对路径
- BugKuCTF WEB web4
- 优雅的使用 PhpStorm 来开发 Laravel 项目
- CLIENT系列、OFFSET系列、SCROLL系列
- java lucene cms_JEECMSv6标签使用之[@cms_lucene_list]
- 如何优雅地过滤敏感词
- Struts1与Struts2原理 区别 详解 汇总
- android获取路由器ip地址吗,查看路由器IP地址方法(管理后台地址)
- ITEXT PDF文件的拆分与合并
- 力天创见客流统计分析系统
- 将制作好的系统启动U盘还原
- VScode配置C/C++环境(适合大学生C++课程,从零开始配置)
- 下载Gazebo模型
- 宋宝华: 关于DMA ZONE和dma alloc coherent若干误解的彻底澄清
- 双轴反作用轮定点自平衡杆动力学模型
- 微软office365服务器地址,由世纪互联运营的 Office 365 的 URL 和 IP 地址范围
- 基于云开发的智慧校园小程序的设计与实现
- 51单片机小项目--超声波避障小车
- Flarum 源码安装错误
- pushmail的一点总结
热门文章
- java判断题_【Java判断题】请大神们进来看下、这些判断题你都知道多少~
- 为什么Java里面的静态方法不能是抽象的
- react本地储存_如何使用React和本地存储构建freeCodeCamp的配方框
- react 组件引用组件_React Elements VS React组件
- python 数据框缺失值_Python:处理数据框中的缺失值
- 【iOS - 周总结】开发中遇到的小知识点(2018.12.10-2018.12.15)
- 重构 改善既有代码的设计:代码的坏
- 删除Autorun.inf的方法
- 英语磁带与计算机磁带区别,小学教材仍配发英语磁带遭吐槽:谁还用录音机
- dll oem证书导入工具_技术干货 | 恶意代码分析之反射型DLL注入