这个问题可以从三个方面来展开说明:
第一、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:文中如有疑问或者错处,可以私信“且慢码农”。