javascript异步和单线程

本文通过实例讲解了JavaScript中的异步机制及其与单线程的关系,探讨了何时使用异步,以及异步如何避免阻塞程序执行。

什么是异步?

先举个例子:

console.log(100)
setTimeout(() => {
    console.log(200)
}, 1000)
console.log(300)

上面的结果很容易看出,打印的顺序是100 300 200

从上面的例子可以看出,异步是不会阻塞进程的,而同步会阻塞进程,这也是同步和异步的区别。js中同步的典型例子为alert方法,他会阻塞进程,只有当打印后才会继续向下运行。

console.log(100)
alert(200)
console.log(300)

只有当alert方法弹出的对话框被点击确认,才会输出300

什么情况下需要异步?

有可能发生等待的情况,等待过程中不能阻塞其他程序的运行:
定时任务: setTimeout, setInterval
网页请求: ajax、动态< img >加载
事件绑定: addEventListener

什么是单线程

javascript在同一时间只能执行一个任务。javascript是单线程的,所以需要异步。
每一时刻最多会有一个任务处于执行状态下,其他任务处于就绪态或阻塞态(这里的阻塞态是指该任务没有获取到满足执行的资源,但是并不会阻塞其他任务的执行),一旦资源满足,则任务进入就绪队列,对于如何进入就绪队列,不同的浏览器有不同的调度算法。例如一个计时器setTimeout,当该计时器执行时,并不会立即执行内部的回调函数,而是先把它放在一边,等待计时的时间到达。当时间到达时,即回调函数调用的条件满足,浏览器会把执行函数的任务根据调度算法加入就绪队列,直到当前任务完成,再从就绪队列取出执行下一个任务。
以开始的一段代码为例,下图为异步执行过程:
这里写图片描述

1S时间以后,setTimeout的回调函数被调用,当前并没有执行任务,所以函数被立即执行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值