JavaScript的运行机制简述-阿里云开发者社区

开发者社区> 武汉-吴昆来> 正文

JavaScript的运行机制简述

简介: 关于JavaScript的运行机制,很多人并不是很能理解的清楚,在这里我将进行简单的概述
+关注继续查看

同步与异部

JavaScript是一门单线程语言。单线程就意味着,执行任务时需要一个接着一个执行,前一个执行结束才能继续执行下一个任务。如果排队是因为计算量大,CPU忙不过来,倒也算了,但是很多时候CPU是闲着的,因为IO设备(输入输出设备)很慢(比如Ajax操作从网络读取数据),不得不等着结果出来,再往下执行。JavaScript的开发者在开发时想到了这一点,将等待执行的任务挂起,继续执行后面的任务,也可以说在执行栈中需要等待的任务放到任务队列中,等到主线程执行完成后将任务栈中的完成的任务拿出来进行执行。这就是所谓的同步任务与异步任务。

123123.png

1、同步和异步任务分别进入不同的执行"场所",同步的进入主线程,异步的进入Event Table并注册函数。

2、当Event Table中指定的事情完成时,会将这个函数移入Event Queue。

3、主线程内的任务执行完毕为空,会去Event Queue读取对应的函数,进入主线程执行。

4、上述过程会不断重复,也就是常说的Event Loop(事件循环)。

5、我们不禁要问了,那怎么知道主线程执行栈为空啊?js引擎存在monitoring process进程,会持续不断的检查主线程执行栈是否为空,一旦为空,就会去Event Queue那里检查是否有等待被调用的函数。

​JavaScript的宏任务与微任务

macro-task(宏任务):包括整体代码script,setTimeout,setInterval

micro-task(微任务):Promise,process.nextTick

不同类型的任务会进入对应的Event Queue。

事件循环的顺序,决定js代码的执行顺序。进入整体代码(宏任务)后,开始第一次循环。接着执行所有的微任务。然后再次从宏任务开始,找到其中一个任务队列执行完毕,再执行所有的微任务。

示例

var promise=new Promise((resolve)=>{
            console.log(1)
            resolve()
        })
        setTimeout(()=>{
            console.log(2)
        })
        promise.then(()=>{
            console.log(3)
        })
        var promise2=getPromise()
        async function getPromise(){
            console.log(5)
            await promise;
            console.log(6)
            await promise2;
            console.log(7)
        }
        console.log(8)
        var promise3=new Promise((resolve)=>{
            console.log(10)
            resolve()
        })

这段代码中,输出顺序是什么?

顺序.png

为什么会是这样?

因为以同步异步的方式来解释执行机制是不准确的,更加准确的方式是宏任务和微任务:    因此执行机制便为:执行宏任务 ===> 执行微任务 ===> 执行另一个宏任务 ===> 不断循环即:在一个事件循环中,执行第一个宏任务,宏任务执行结束,执行当前事件循环中的微任务, 执行完毕之后进入下一个事件循环中,或者说执行下一个宏任务

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器安全组设置内网互通的方法
虽然0.0.0.0/0使用非常方便,但是发现很多同学使用它来做内网互通,这是有安全风险的,实例有可能会在经典网络被内网IP访问到。下面介绍一下四种安全的内网互联设置方法。 购买前请先:领取阿里云幸运券,有很多优惠,可到下文中领取。
9514 0
阿里云ECS云服务器初始化设置教程方法
阿里云ECS云服务器初始化是指将云服务器系统恢复到最初状态的过程,阿里云的服务器初始化是通过更换系统盘来实现的,是免费的,阿里云百科网分享服务器初始化教程: 服务器初始化教程方法 本文的服务器初始化是指将ECS云服务器系统恢复到最初状态,服务器中的数据也会被清空,所以初始化之前一定要先备份好。
10785 0
JavaScript 运行机制详解
代码块: JS中的代码块是指由标签分割的代码段。JS是按照代码块来进行编译和执行的,代码块间相互独立(即就算代码块1出错,但不影响代码块2的加载和执行),但变量和方法共享。 案例:2个代码块     console.log("这是代码块一");       console.log ("这是代码块二");   HTML页面中JS的加载原理: 在加载HTML页面的时候,当浏览器遇到内嵌的JS代码时会停止处理页面,先执行JS代码,然后再继续解析和渲染页面。
969 0
如何设置阿里云服务器安全组?阿里云安全组规则详细解说
阿里云安全组设置详细图文教程(收藏起来) 阿里云服务器安全组设置规则分享,阿里云服务器安全组如何放行端口设置教程。阿里云会要求客户设置安全组,如果不设置,阿里云会指定默认的安全组。那么,这个安全组是什么呢?顾名思义,就是为了服务器安全设置的。安全组其实就是一个虚拟的防火墙,可以让用户从端口、IP的维度来筛选对应服务器的访问者,从而形成一个云上的安全域。
4269 0
阿里云服务器ECS登录用户名是什么?系统不同默认账号也不同
阿里云服务器Windows系统默认用户名administrator,Linux镜像服务器用户名root
1161 0
3
文章
0
问答
来源圈子
更多
阿里云GTS能力中心(浩鲸智能),从交付的视角探讨数字化转型过程中大型软件开发实践、以及阿里云产品在各行业被集成的案例分享、技术沉淀等内容。敬请关注!
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载