js是一门单线程语言。
进程,线程之我的理解。
进程:系统会为其分配内存。
线程:进程执行的最小单位。
我们可以把进程比作工厂,而线程比作工人。
js是单线程语言
为何不是多线程?假设现在js是多线程,现在两个线程同时分别修改同一个dom元素,那么浏览器就不知道究竟该选择哪个线程,这时候问题就出来了。所以js是一门单线程的一门语言。
同步和异步
为什么会有同步和异步的概念。(参考大佬:https://www.cnblogs.com/Yellow-ice/p/10433423.html)。因为js是单线程的,所以每次只能同步的做一件事情。
但是当我们发请求的时候,加入需要等待5秒的话,那么按照同步的执行的话,后面的代码就会被阻塞,因此,js设计之初就考虑到这个问题,然后就引出了异步的概念。
代码执行顺序
代码执行先执行同步任务然后再执行异步任务。异步任务执行顺序又是怎样的呢这里就要引出宏任务和微任务的概念了。
代码执行顺序是先执行第一个宏任务(script代码),然后执行宏任务下的微任务,当执行完第一次所有的宏任务完成后,然后依次执行宏任务下的微任务(微任务:new promise()下的then里的回调函数)。然后再执行下一次的宏任务(setTimeout或者setTimeInterval)。
(参考大佬:https://blog.csdn.net/xiaojinguniang/article/details/88311534?utm_medium=distribute.wap_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.wap_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase)
举个例子:
···
setTimeout(function(){console.log(1)},0);
new Promise(function(resolve){
console.log(2)
for( var i=0 ; i<10000 ; i++ ){
i==9999 && resolve()
}
console.log(3)
}).then(function(){
console.log(4)
});
new Promise(function(resolve){
console.log(22)
for( var i=0 ; i<10000 ; i++ ){
i==9999 && resolve()
}
console.log(33)
}).then(function(){
console.log(44)
});
console.log(5);
//答案是:2,3,22,33,5,4,44,1···