
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
JavaScript 是单线程语言。在浏览器中,当JS代码被加载时,浏览器会为其分配一个主线程来执行任务,主线程会在栈中创建一个全局执行环境 (全局作用域)。每当有一个函数进入执行流时,就会形成一个对应的执行环境(函数作用域),并将该执行环境压入栈中。每当一个函数执行完毕以后,对应的执行环境就会从栈中弹出,然后被销毁。这就是执行环境栈,执行环境栈的作用就是保证所有的函数能按照正确的顺序被执行。
但在浏览器中,有一些任务是非常耗时的,比如 ajax请求、定时器、事件等。为了保证主线程上的任务不被阻塞,JavaScript 内部维护了一个任务队列, 当这些耗时任务结束时(Ajax 请求返回、定时器超时、事件被触发),就将对应的回调函数插入队列中进行等待。这些任务的执行时机并不确定,只有当所有同步任务执行完毕后,执行环境栈被清空(栈底的全局执行环境会一直存在,直到进程退出)以后,然后再从任务队列中依次读取回调函数,并将其压入执行环境栈中。于是,主线程开始执行新的同步任务,执行完毕后再从栈中弹出,栈被清空。
主线程从任务队列中读取任务是不断循环的,每当栈被清空后,主线程就会从任务队列中读取新的任务并执行,如果没有新的任务,就会一直等待,直到有新的任务。JavaScript 的这种执行机制就叫做任务循环。因为每个任务都由一个事件所触发,所以也叫 “事件循环”。