JS引擎是单线程的,但又能实现异步的原因在于事件循环和任务队列体系。
事件循环:
1、JS会创建一个类似于while (true)的循环,每执行一次循环体的过程称之为Tick„每 次Tick的过程就是查看是否有待处理事件,如果有则取出相关事件及回调函数放入执行栈中 由主线程执行。待处理的事件会存储在一个任务队列中,也就是每次Tick会查看任务队列中 是否有需要执行的任务。
任务队列:
1,异步操作会将相关回调添加到任务队列中。而不同的异步操作添加到任务队列的时机也不 同,如onclick, setTimeout, ajax处理的方式都不同,这些异步操作是由浏览器内核的 webcore来执行的,浏览器内核包含3种webAPI,分别是DOM Binding、 network、timer模 块。
2、 onclick由DOM Binding模块来处理,当事件触发的时候,回调函数会立即添加到任务 队列中。setTimeout由timer模块来进行延时处理,当时间到达的时候,才会将回调函数 添加到任务队列中。ajax由network模块来处理,在网络请求完成返回之后,才将回调添 加到任务队列中。
主线程:
1、 JS只有一个线程,称之为主线程。而事件循环是主线程中执行栈里的代码执行完毕之后, 才开始执行的。所以,主线程中要执行的代码时间过长,会阻塞事件循环的执行,也就会阻塞 异步操作的执行。
2,只有当主线程中执行栈为空的时候(即同步代码执行完后),才会进行事件循环来观察要 执行的事件回调,当事件循环检测到任务队列中有事件就取出相关回调放入执行栈中由主线程 执行。

Was this helpful?

0 / 0

发表回复 0

Your email address will not be published.