JS为什么可以处理异步任务?通过事件循环(Event loop)来实现的,如果了解Event loop就了解JS的执行机制。

这个问题可以从三个方面来展开说明:

第一、JS为什么是单线程?

第二、JS为什么需要异步?

第三、JS是单线程,怎么实现异步的?

想知道为什么,先问一下自己这三个问题。。。

JS为什么是单线程?

        试想一下,JS最初的设计就是在浏览器中使用的,如果浏览器中的JS是多线程的话,那么,这时有两个任务进程task1和task2,由于是多线程的JS,这两个task1和task2对同一个DOM元素进行操作,task1任务是删除DOM功能,task2任务是编辑DOM功能,同时下达了两个矛盾命令,浏览器就晕菜了,不知道要处理哪个任务。因此JS是单线程。

JS为什么需要异步?

        JS是单线程,如果JS不存在异步的话,所有的任务指令都只能自上而下的执行;如果其中有一行或者一个任务的解析时间较长,这时后面的代码就会阻塞,被迫干等着,对于用户而言就形成了非常差的体验,有种页面卡死的感觉,所以JS中要有异步处理操作。

JS是单线程,怎么实现异步的?   

        通过事件循环(Event loop)来实现的,如果了解Event loop就了解JS的执行机制

单独来了解一下Event loop

    Event loop(1):

console.log('第一:1');
setTimeout(()=>{
    console.log('第二:2');
},1000);
console.log('第三:3');


*****运行输出的结果顺序*****

 第一:1
 第三:3
 第二:2

*****解释说明*****

setTimeout延时1秒执行,形成了异步任务,被放在了event table里,异步任务在event table中注册函数,满足执行条件后,会被推入到event queue里执行;
console.log('第一:1')和console.log('第三:3')是立即执行,属于同步任务,放在了主线程里面执行;

 Event loop(2):

setTimeout(()=>{
    console.log('setTimeout执行,异步任务,满足等待时间才会执行');
},1000);

new Promise((resolve,reject)=>{
    console.log('我在promise里,我是同步任务,会马上执行');
});



*****运行输出的结果顺序*****

 我在promise里,我是同步任务,会马上执行

 setTimeout执行,异步任务,满足等待时间才会执行



*****解释说明*****

setTimeout延时1秒执行,被放在了event table里,异步任务在event table中注册函数,满足执行条件后,会被推入到event queue里执行;

new Promise是同步任务,被放在主线程里立即执行;

Tips:文中如有疑问或者错处,可以私信“且慢码农”。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值