需要很长时间执行的方法和setTimeout函数之间有什么区别吗?

is there any difference between a method that takes long time to execute and the setTimeout function?

我在学习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);
}
 

这也放到另一个调用栈中吗?

您必须知道的一件事是 fetchsetTimeout 函数实际上并不是 javascript 的函数。它们属于 Window - Web Apis。您可以在这里阅读更多相关信息:https://developer.mozilla.org/en-US/docs/Web/API/Window

无论何时您使用这些函数,它们都会离开调用堆栈并进入可能用 C# 或其他语言编写的 window api。一旦他们完成了他们应该做的事情,他们就会在回调队列中发回响应,你可以把它想象成一个不同的调用堆栈。

Javascript 本身是单线程的,但具有来自 window api 的函数,它可以是 运行 异步的。