热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

浅谈js实行机制

关于js实行机制,老早之前就一向想写篇文章做个总结,由于和js实行递次的面试题碰到的迥殊多,每次碰到老是会去网上查,没有体系地总结,搞得每次碰到都是似懂非懂的觉得,这篇文章就体系的

关于js实行机制,老早之前就一向想写篇文章做个总结,由于和js实行递次的面试题碰到的迥殊多,每次碰到老是会去网上查,没有体系地总结,搞得每次碰到都是似懂非懂的觉得,这篇文章就体系的总结一下js实行机制。

使命行列

人人都晓得js最大的特性就是单线程实行,这就是为何js简朴易学的一个重要原因,不需要斟酌庞杂的同步题目,然则单线程也会有一个题目,一切的使命在实行的历程当中都必需守候前一个使命实行完成才实行,如许就会带来一个效力的题目,为了处理这个题目,js将使命分为两种:同步使命和异步使命,同步使命就是之前说后一个使命必需守候前一个使命实行完成才实行,是在主线程上实行的,而异步使命不会直接进入主线程实行,而是进入使命行列,只要在使命行列关照异步使命能够实行时,才会被推入主线程实行。让我们来看一个越发直观的流程图:

《浅谈js实行机制》

setTimeout和setInterval

说到异步使命,最常见就是setTimeout和setInterval两兄弟了,setTimeout是耽误肯定时刻后实行,然则只实行一次,setInterval是每隔肯定的时刻实行一次,会实行屡次,然则有时刻我们会发明设置肯定的耽误时刻后,回调函数的实行时刻会比我们设置的时刻要晚,这是为何呢?上面我们说过,在使命实行的时刻setTimeout这类异步使命的回调会被放到异步行列中守候实行,当耽误时刻终了时,假如主线程的使命已实行完了,也就是处在余暇状况时,就会将使命行列的回调推到主线程实行,然则当主线程的使命还没有实行完成时,就只能继承守候,来看一个例子:

let before = new Date()
setTimeout(() => {
console.log(new Date() - before)
}, 1000)
for (let i = 0; i <300000; i++) {
console.log('time delay')
}

从上面的例子就能够看到:当我们实行完setTimeout以后,马上实行20万次的轮回,从实行效果能够看到,setTimeout回调函数中的时刻远高于设置1000ms,这就是由于时刻到了,然则主线程的使命还没有实行完成致使。这类题目在setInterval设置倒计时的常常碰到,倒计时最先的时刻设置的时刻是从服务器拿到的体系时刻很正确,然则假如背面不定期像服务期要求体系时刻举行校准的话,你可能会发明倒计时的误差越来越来大,这就是主线程实行的时刻比设定的耽误时刻长致使的。

macrotask和microtask

在js中,异步使命除了有setTimeout这类的异步使命,另有一类就是es6中很经常使用promise&#8230;then这类的异步使命,因而除了同步使命和异步使命,使命还能够越发细分为macrotask(宏使命)和microtask(微使命)
macrotask: 包含setTimeout、setInterval和实行栈
microtask: 包含Promise、process.nextTick
要想明白这两个观点,直接从一道简朴的面试题入手,来看一个例子:

setTimeout(function() {
console.log(1)
}, 0);
new Promise(function(resolve, reject) {
console.log(2);
resolve()
}).then(function() {
console.log(3)
});
process.nextTick(function () {
console.log(4)
})
console.log(5)

思索一下上面例子的输出效果,我们来仔细分析一下实行历程:

  • 第一轮:主线程最先实行,碰到setTimeout,将setTimeout的回调函数丢到宏使命行列中,在往下实行new Promise马上实行,输出2,then的回调函数丢到微使命行列中,再继承实行,碰到process.nextTick,一样将回调函数扔到为使命行列,再继承实行,输出5,当一切宏使命实行完成后看有没有能够实行的微使命,发明有then函数和nextTick两个微使命,先实行哪一个呢?process.nextTick指定的异步使命老是发作在一切异步使命之前,因而先实行process.nextTick输出4然后实行then函数输出3,第一轮实行终了。
  • 第二轮从宏使命行列最先,发明setTimeout回调,输出1实行终了,因而效果是25431

最后用一张图来总结一下:

《浅谈js实行机制》

总结

这篇文章简朴引见了js实行机制,愿望看了以后,能够对人人熟悉js的实行机制会有所协助。
假如有毛病或不严谨的处所,迎接批评指正,假如喜好,迎接点赞珍藏


推荐阅读
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文介绍了闭包的定义和运转机制,重点解释了闭包如何能够接触外部函数的作用域中的变量。通过词法作用域的查找规则,闭包可以访问外部函数的作用域。同时还提到了闭包的作用和影响。 ... [详细]
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 本文讨论了在Windows 8上安装gvim中插件时出现的错误加载问题。作者将EasyMotion插件放在了正确的位置,但加载时却出现了错误。作者提供了下载链接和之前放置插件的位置,并列出了出现的错误信息。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 不同优化算法的比较分析及实验验证
    本文介绍了神经网络优化中常用的优化方法,包括学习率调整和梯度估计修正,并通过实验验证了不同优化算法的效果。实验结果表明,Adam算法在综合考虑学习率调整和梯度估计修正方面表现较好。该研究对于优化神经网络的训练过程具有指导意义。 ... [详细]
  • 从零学Java(10)之方法详解,喷打野你真的没我6!
    本文介绍了从零学Java系列中的第10篇文章,详解了Java中的方法。同时讨论了打野过程中喷打野的影响,以及金色打野刀对经济的增加和线上队友经济的影响。指出喷打野会导致线上经济的消减和影响队伍的团结。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了机器学习手册中关于日期和时区操作的重要性以及其在实际应用中的作用。文章以一个故事为背景,描述了学童们面对老先生的教导时的反应,以及上官如在这个过程中的表现。同时,文章也提到了顾慎为对上官如的恨意以及他们之间的矛盾源于早年的结局。最后,文章强调了日期和时区操作在机器学习中的重要性,并指出了其在实际应用中的作用和意义。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • MATLAB函数重名问题解决方法及数据导入导出操作详解
    本文介绍了解决MATLAB函数重名的方法,并详细讲解了数据导入和导出的操作。包括使用菜单导入数据、在工作区直接新建变量、粘贴数据到.m文件或.txt文件并用load命令调用、使用save命令导出数据等方法。同时还介绍了使用dlmread函数调用数据的方法。通过本文的内容,读者可以更好地处理MATLAB中的函数重名问题,并掌握数据导入导出的各种操作。 ... [详细]
  • SpringMVC接收请求参数的方式总结
    本文总结了在SpringMVC开发中处理控制器参数的各种方式,包括处理使用@RequestParam注解的参数、MultipartFile类型参数和Simple类型参数的RequestParamMethodArgumentResolver,处理@RequestBody注解的参数的RequestResponseBodyMethodProcessor,以及PathVariableMapMethodArgumentResol等子类。 ... [详细]
  • 深入解析Linux下的I/O多路转接epoll技术
    本文深入解析了Linux下的I/O多路转接epoll技术,介绍了select和poll函数的问题,以及epoll函数的设计和优点。同时讲解了epoll函数的使用方法,包括epoll_create和epoll_ctl两个系统调用。 ... [详细]
  • 本文是一篇翻译文章,介绍了async/await的用法和特点。async关键字被放置在函数前面,意味着该函数总是返回一个promise。文章还提到了可以显式返回一个promise的方法。该特性使得async/await更易于理解和使用。本文还提到了一些可能的错误,并希望读者能够指正。 ... [详细]
author-avatar
寻路灬鸿
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有