首页 > 解决方案 > 需要很长时间执行的方法和 setTimeout 函数之间有什么区别吗?

问题描述

我正在学习 JavaScript。我有个疑问。听说当我们使用setTimeout方法的时候,javascript会把那个setTimeout的回调函数从调用栈中移除,放到另一个调用栈上,继续执行当前的调用栈。


function f1() {
  console.log("print first");
  setTimeout(() => {
    console.log("print in time out");
  }, 4000);
  console.log("print last");

}

这个函数的输出

打印第一个
打印最后一个
打印超时

因为 setTimeOut 的回调放入了一个新的堆栈。

如果我使用 Ajax 请求或类似的东西需要一些时间来执行而不使用异步怎么办。像这样的东西。


function API(){
    const apiCALL = fetch('https://jsonplaceholder.typicode.com/posts');
    console.log(apiCALL);
}
 

这是否也放入另一个调用堆栈?

标签: javascriptsettimeoutcallstack

解决方案


您必须知道的一件事是fetchsetTimeout函数都不是真正的javascript函数。它们属于 Window - Web APIs。您可以在此处阅读更多相关信息:https ://developer.mozilla.org/en-US/docs/Web/API/Window

每当您使用这些函数时,它们都会从调用堆栈进入可能用 C# 或其他东西编写的窗口 api。一旦他们完成了他们应该做的事情,他们就会在回调队列中发回响应,您可以将其想象为不同的调用堆栈。

Javascript 本身是单线程的,但使用 window api 的函数可以异步运行。


推荐阅读