这是我参与2022首次更文挑战的第21天,活动详情查看:2022首次更文挑战」。
js是是单线程的,也就是说,如果有多个任务的话,需要一个一个按顺序排队执行,上一个任务执行完后才能执行下一个任务,换一句话说,就是下一个任务要想执行,必须等待上一个任务执行完。
所以说如果遇到一个任务执行时间很长,比如ajax请求,需要等待数据响应。这时什么都不做只等待数据响应,体验十分不好,这样显然不合适, 设计者自然也意识到此问题,所以就有了同步任务与异步任务之分。
js中所有同步任务都在主线程上执行,形成一个执行栈
当遇到有像ajax请求这样的异步操作,会先挂起等待中的任务,先处理后面的,等异步任务有结果了后,就会在任务队列中添加一个事件。
一旦"执行栈"中的所有同步任务执行完毕,系统就会读取"任务队列",看看里面有哪些事件。那些对应的异步任务,于是结束等待状态,进入执行栈,开始执行。
回调函数,就是那些会被主线程挂起来的代码。异步任务必须指定回调函数,当主线程开始执行异步任务,就是执行对应的回调函数。
单线程从从任务队列中读取任务是不断循环的,每次栈被清空后,都会在任务队列中读取新的任务,如果没有任务,就会等到,直到有新的任务,这就叫做任务循环,因为每个任务都是由一个事件触发的,因此也叫作事件循环