问题
1.当代码碰见异步(WebAPIs)函数应该如何处理
- 将函数放到
Call Stack判断 - 如果是异步函数
setTimeout浏览器会选择性忘记它 => 并把他丢给任务队列 - 任务队列取出其中的回调函数
()=>{}并将其放到消息队列(Message Queuse)中 - 调用栈执行并检查
Call Stack调用栈是否为空,如果当前函数在调用栈中并且函数没有调用完- 如果为空,会将消息队列中可用的下一个项目添加到调用堆栈中 => 并执行
Event Loop=> 将获取消息队里的下一个项目并将其添加到调用堆栈(Call Stack)中()=>{console.log("1")}console.log("1")=> 从调用栈中删除
- 将
()=>{console.log()}从调用栈中删除
- 如果为空,会将消息队列中可用的下一个项目添加到调用堆栈中 => 并执行
- 当前调用栈为空(trim),并且消息队列(Message Queue)中也为空
- 此时 JS 在登台另一个需要执行的 JS 命令
总结
- 实现异步 JS,事件循环(event Loop)对于实现这一点至关重要 , 虽然 js 是同步,但是它与事件循环(event Loop)和 WebAPIs 的交互允许我们可以实现异步编码
- JS 是单线程 => 只有一个调用栈 => 一次只能做一件事 => 同步
- 哪些属于浏览器的任务,JavaScript 引擎不必处理
但是被作为需要处理一部分的回调被继承会事件循环引擎中使用- 所作所为 从消息队列中拉出并将它们添加到调用堆栈中
- 一旦(消息队列)回调添加到调用堆栈,代码将由调用栈处理
- 如果代码不是来自队列(queue) => 提醒事件循环不断检查队列中的项目 => 如果调用堆栈为空的并且队列中有东西 => 将队列中的下一个可用项目添加到调用堆栈(event loop)中