javascript - 需要很长时间执行的方法和 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);
}
这是否也放入另一个调用堆栈?
解决方案
您必须知道的一件事是fetch
和setTimeout
函数都不是真正的javascript函数。它们属于 Window - Web APIs。您可以在此处阅读更多相关信息:https ://developer.mozilla.org/en-US/docs/Web/API/Window
每当您使用这些函数时,它们都会从调用堆栈进入可能用 C# 或其他东西编写的窗口 api。一旦他们完成了他们应该做的事情,他们就会在回调队列中发回响应,您可以将其想象为不同的调用堆栈。
Javascript 本身是单线程的,但使用 window api 的函数可以异步运行。
推荐阅读
- java - 一些关键字在 VS Code for JAVA 中有下划线
- ios - 在 iOS 中使用状态栏和所有内容以编程方式截取屏幕截图?
- java - Java:用流汇总数据
- lua - FiveM 服务器,表索引为 nil && 尝试索引 nil 值(本地,xPlayer)
- java - Cassandra 和 Java Spring 分页中的 OrderBy 子句中断
- c# - AspNetCore 3.1 角色策略不适用于视图控制器
- c - 使用 C 在 Linux 中获取处理器类型
- sql - 如何优化使用游标的 PL/SQL 代码
- azure-devops - 通用包工件 - 在管道中使用包视图
- java - 嘿,我正在尝试在 Eclipse 中使用 GUI 设计器插件创建一个应用程序窗口,但它向我显示以下错误