Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >js线程机制的介绍和练习

js线程机制的介绍和练习

作者头像
卡少
发布于 2018-05-16 01:58:17
发布于 2018-05-16 01:58:17
84200
代码可运行
举报
文章被收录于专栏:卡少编程之旅卡少编程之旅
运行总次数:0
代码可运行

给定的几行代码,我们需要知道其输出内容和顺序。JavaScript是一门单线程语言,但有其独特的线程机制

热身代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
setTimeout(function(){
    console.log('定时器开始啦')
});
new Promise(function(resolve){
    console.log('马上执行for循环啦');
    for(var i = 0; i < 10000; i++){
        i == 99 && resolve();
    }
}).then(function(){
    console.log('执行then函数啦')
});
console.log('代码执行结束');

JavaScript事件循环

  • 同步任务 -> 主线程 -> 任务顺序执行完毕
  • 异步任务 -> Event Table -> EventQueue(并入主执行线程)

同步和异步任务分别进入不同的执行"场所",同步的进入主线程,异步的进入Event Table并注册函数。 当指定的事情完成时,Event Table会将这个函数移入Event Queue。 主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。 上述过程会不断重复,也就是常说的Event Loop(事件循环)。

JS引擎存在monitoring process进程,会持续不断的检查主线程执行栈是否为空,一旦为空,就会去Event Queue那里检查是否有等待被调用的函数。

定时器线程

  1. setTimeout这个函数,是经过指定时间后,把要执行的任务加入到Event Queue中,又因为是单线程任务要一个一个执行,如果前面的任务需要的时间太久,那么只能等着
  2. setTimeout(fn,0)的含义是,指定某个任务在主线程最早可得的空闲时间执行,只要主线程执行栈内的同步任务全部执行完成,栈为空就马上执行。
  3. setInterval会每隔指定的时间将注册的函数置入Event Queue,如果前面的任务耗时太久,那么同样需要等待。
  4. 对于setInterval(fn,ms)来说,我们已经知道不是每过ms秒会执行一次fn,而是每过ms秒,会有fn进入Event Queue。

一旦setInterval的回调函数fn执行时间超过了延迟时间ms,那么就完全看不出来有时间间隔了

Promise与process.nextTick(callback)

process.nextTick 指在node.js里面,事件循环的下一次循环中调用callback

除了广义的同步和异步任务,更精细的定义为:

macro-task(宏任务):包括整体代码script,setTimeout,setInterval micro-task(微任务):Promise,process.nextTick 接下来的主要介绍这两个任务的概念和线程表现:

  1. 这两种类型的任务会进入与之对应的EventQueue
  2. 事件循环的顺序,决定JS代码的执行顺序
  3. 先是进入整体代码的宏任务,开始事件循环,然后紧接着执行当前宏任务的微任务
  4. 执行完当前宏任务的微任务后 进入EventQueue里面的下一个宏任务

代码练习

我们来分析一段较复杂的代码,看看你是否真的掌握了JS的执行机制

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
console.log('1');
setTimeout(function() {
    console.log('2');
    process.nextTick(function() {
        console.log('3');
    })
    new Promise(function(resolve) {
        console.log('4');
        resolve();
    }).then(function() {
        console.log('5')
    })
})
process.nextTick(function() {
    console.log('6');
})
new Promise(function(resolve) {
    console.log('7');
    resolve();
}).then(function() {
    console.log('8')
})
setTimeout(function() {
    console.log('9');
    process.nextTick(function() {
        console.log('10');
    })
    new Promise(function(resolve) {
        console.log('11');
        resolve();
    }).then(function() {
        console.log('12')
    })
})

。 。 。 。 。 。

标准答案:1 7 6 8 2 4 3 5 9 11 10 12

总结:

  • JavaScript是一门单线程语言
  • Event Loop是JavaScript的执行机制
  • 针对Promise的知识,这里推荐一篇文章,非常值得一看
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
小白理解 JavaScript 执行机制
所以,为了避免复杂性,从一诞生,JavaScript就是单线程,这已经成了这门语言的核心特征,将来也不会改变。
前端魔法师
2021/01/27
6150
这一次,彻底弄懂 JavaScript 执行机制
本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,可以揍我。
前端迷
2018/12/06
1.2K0
这一次,彻底弄懂 JavaScript 执行机制
JavaScript之Event Loop
先看段代码: console.log(1); setTimeout(function () { console.log(2); new Promise(function (resolve, reject) { console.log(3); resolve(); console.log(4); }).then(function () { console.log(5); }); }); function fn
laixiangran
2018/04/24
7880
JavaScript之Event Loop
深入理解事件循环
本篇博客讲的东西偏底层,较难理解。虽然有的地方不够精准和全面,但是我觉得对于理解js中的异步来说已经够了,所以没有再深究一些概念(比如浏览器在这个过程中充当的角色)。
Chor
2019/11/07
8580
22道js输出顺序问题,你能做出几道
单线程是 JavaScript 核心特征之一。这意味着,在 JS 中所有任务都需要排队执行,前一个任务结束,才会执行后一个任务。
loveX001
2022/10/03
1.1K0
事件循环Event Loop
js是单线程,js任务也要一个一个顺序执行。如果一个任务耗时过长,那么后一个任务也必须等着。那么问题来了,假如我们想浏览新闻,但是新闻包含的超清图片加载很慢,难道我们的网页要一直卡着直到图片完全显示出来?因此聪明的程序员将任务分为两类:1)同步任务 2)异步任务
程序员法医
2022/08/11
1K0
事件循环Event Loop
【THE LAST TIME】彻底吃透 JavaScript 执行机制
首先我们需要声明下,JavaScript 的执行和运行是两个不同概念的,执行,一般依赖于环境,比如 node、浏览器、Ringo 等, JavaScript 在不同环境下的执行机制可能并不相同。而今天我们要讨论的 Event Loop 就是 JavaScript 的一种执行方式。所以下文我们还会梳理 node 的执行方式。而运行呢,是指JavaScript 的解析引擎。这是统一的。
Nealyang
2019/09/29
4570
【THE LAST TIME】彻底吃透 JavaScript 执行机制
JavaScript 事件循环机制
javascript是一门单线程的非阻塞的脚本语言。单线程意味着javascript在执行代码的任何时候,都只有一个主线程来处理所有的任务。
Jimmy_is_jimmy
2019/07/31
5250
JS 事件循环
众所周知,JavaScript 是一门单线程语言,虽然在 html5 中提出了 Web-Worker ,但这并未改变 JavaScript 是单线程这一核心,可是浏览器又能很好的处理异步请求,那么到底是为什么呢?
Umbrella1024
2021/03/25
15.4K0
JavaScript 同步和异步的执行机制问题
今天做项目的时候遇到了一个问题,当我在请求完后端数据的时候,想去立刻打印出请求出来的信息时,怎么打印都是空的,但是出来这个请求方法之后他又有数值了,于是我很纳闷,研究了1个小时找出了原因。
wsuo
2020/09/22
8320
JS运行机制
本文阐述了浏览器端和node端的js运行机制执行的过程,还进行了两者的运行机制比较,以及同步任务和异步任务的说明,两种异步任务的必要性,以及各自有哪些回调,部分回调的优先级。
ClyingDeng
2022/11/29
3.8K0
JS运行机制
JS异步编程
同步(sync)是一件事一件事的执行,只有前一个任务执行完毕才能执行后一个任务。异步(async)相对于同步,程序无须按照代码顺序自上而下的执行。
Cloud-Cloudys
2020/07/06
3K0
Promise、setTimeout的执行顺序
Event Loop 这个概念相信大家或多或少都了解过,所谓温故而知新,so,今天,我们就从event loop出发,看看在事件的执行过程中,他都经历了些什么。
Snine
2022/02/11
6770
Promise、setTimeout的执行顺序
深入理解JS执行机制
JavaScript是一门单线程的非阻塞脚本语言,同一时刻只允许一个代码段执行。在单线程的机制下,执行异步任务时,在等待结果返回的这个时间段,后面的代码就无法执行了。
神奇的程序员
2022/04/10
4110
深入理解JS执行机制
JavaScrit中的Event Loop(事件循环)
举一个例子,如果js同时有两个线程,同时对同一个dom进行操作,这时浏览器应该听哪个线程的,如何判断优先级?
刘亦枫
2020/03/19
7850
宏任务和微任务代码的执行顺序
JavaScript是一门单线程语言,即一次只能完成一个任务,若有多个任务要执行,则必须排队按照队列来执行(前一个任务完成,再执行下一个任务)。
用户7365393
2021/09/24
2.8K0
JS是单线程,你了解其运行机制吗?
如果是windows电脑中,可以打开任务管理器,可以看到有一个后台进程列表。对,那里就是查看进程的地方,而且可以看到每个进程的内存资源信息以及cpu占有率。
夜尽天明
2019/11/13
2.1K0
JS是单线程,你了解其运行机制吗?
如何解释Event Loop面试官才满意?
想要了解JavaScript引擎,首先我们从它的运行机制Event Loop来说起。
童欧巴
2020/03/30
4410
如何解释Event Loop面试官才满意?
10 分钟理解 JS 引擎的执行机制
作者: ziwei3749 原文:https://segmentfault.com/a/1190000012806637 首先,请牢记2点: JS是单线程语言 JS的Event Loop是JS的执行机制。深入了解JS的执行,就等于深入了解JS里的event loop 1.灵魂三问:JS为什么是单线程的?为什么需要异步?单线程又是如何实现异步的呢? 技术的出现,都跟现实世界里的应用场景密切相关的。同样的,我们就结合现实场景,来回答这三个问题。 (1) JS为什么是单线程的? JS最初被设计用在浏览器中,那么想
前端教程
2018/03/05
1.7K0
10 分钟理解 JS 引擎的执行机制
Js 的事件循环(Event Loop)机制以及实例讲解
大家都知道js是单线程的脚本语言,在同一时间,只能做同一件事,为了协调事件、用户交互、脚本、UI渲染和网络处理等行为,防止主线程阻塞,Event Loop方案应运而生…
OBKoro1
2020/10/27
1.7K0
Js 的事件循环(Event Loop)机制以及实例讲解
相关推荐
小白理解 JavaScript 执行机制
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验