浏览器Web API在JavaScript中的运行位置及setTimeout相关疑问
关于浏览器Web API与
setTimeout的运行位置解析 咱先把第一个问题掰扯清楚:浏览器提供的Web API并不运行在JavaScript引擎的主线程里,而是跑在浏览器自身的后台线程环境中。
JavaScript引擎(比如Chrome的V8)本身是单线程的,但浏览器作为一个完整的应用,有好几个后台线程在并行干活——比如处理网络请求的线程、管DOM渲染的线程,还有专门处理定时器、事件监听的线程。这些Web API就是浏览器这些后台线程提供的能力,和JS引擎是互相配合但独立运行的关系。
再来说第二个问题,拿setTimeout举例子:
- 当你在JS代码里调用
setTimeout(callback, delay)时,JS主线程会把这个定时器任务丢给浏览器的定时器线程去处理,自己接着执行后面的代码。 - 定时器线程会开始计时,等指定的
delay时间到了之后,它不会直接去执行callback,而是把这个回调函数放到任务队列里排队。 - 只有当JS主线程把当前执行栈里的代码全部跑完、处于空闲状态时,才会从任务队列里取出这个回调函数,拿到主线程里执行。
总结一下:setTimeout这类Web API的计时/等待逻辑是在浏览器的后台线程运行的,而它的回调函数最终是借助JavaScript的单线程来执行的——毕竟JS引擎本身只有一个主线程,所有可执行的JS代码都得排队在这个线程里跑。
内容的提问来源于stack exchange,提问作者Piyush Biswal
相关产品推荐
相关产品推荐

