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除了这几个明显的耗时问题外,可能我们自己写的程序里面也会有耗时的函数,这种情况怎么处理呢?我们肯定不能自己开辟单独的线程,但我们可以利用浏览器给我们开放的这几个窗口,浏览器定时器线程和事件触发线程是好利用的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值