JavaScript的异步和单线程
什么是单线程
单线程: 就是在同一时间只能做一件事情。
单线程意味这所有的任务都需要排队,执行完一个才能继续执行下一个,但是如果前一个执行很长,后一个任务就需要一直等待。所以这样机会产生问题。
var i,sum = 0;
for(i = 0; i < 99999999; i++){
sum += 1;
}
console.log(sum)
console.log(2);
//因为循环的太多,会导致页面一直卡在循环阶段。
//因此会采用异步的方式解决这个问题。
异步
我们常用的定时器和事件监听请求都属于异步操作。
主线程完全可以不管I/O设备,挂起处于等待中的任务,先运行排在后面的任务。等到IO设备返回了结果,再回过头,把挂起的任务继续执行下。通俗的话说就是:在执行代码时遇到定时器或事件监听等,会产生异步,讲他们放在队列中,然后继续执行下面的代码。同步的代码执行完毕后执行异步的代码。
console.log(100)
setTimeout(function(){
console.log(200)
},1000)
console.log(300);
//100
//300
//200
JavaScript是单线程语言
JavaScript是单线程语言,浏览器只分配给js一个主线程,用来执行任务(函数),但一次只能执行一个任务,这些任务形成一个任务队列排队等候执行,但某些任务是非常耗时的,比如定时器和事件监听,如果让他们和别的任务一样,都老老实实的排队等待执行的话,执行效率会非常的低,甚至导致页面的假死。所以,浏览器为这些耗时任务开辟了另外的线程,主要浏览器定时触发器,浏览器事件触发线程,这些任务是异步的。
异步的机制
JS中所有的任务我们可以把他分为两种,一种是同步任务,一种是异步任务。
整个任务的执行机制是:
1.将所有的同步任务放在主线程上,形成一个执行栈
2.将所有的异步任务都挂起,当达到条件的时候就会放在‘任务队列’中(监听事件,触发事件)
3.执行主线程上的所有同步任务,系统就会在’任务队列’中查看还有那些任务,异步任务结束等待状态,进入执行栈,开始执行
4.系统不断的在主线程和任务列队之间轮询重复上面的第3步奏
浏览器的异步机制
我们已经知道,js一直是单线程执行的,浏览器为几个明显的耗时任务单独开辟线程解决耗时问题,但是js除了这几个明显的耗时问题外,可能我们自己写的程序里面也会有耗时的函数,这种情况怎么处理呢?我们肯定不能自己开辟单独的线程,但我们可以利用浏览器给我们开放的这几个窗口,浏览器定时器线程和事件触发线程是好利用的。