js中是否存在真正的异步?
2025年5月16日 23:29
JavaScript 本身没有“异步执行”的能力,所谓异步,其实都是“通过回调 + 事件循环机制实现的异步行为”。
🔹 1. JS 是单线程的语言
JavaScript 的运行环境(如浏览器、Node.js)中,JS 本身只在主线程中执行,不能同时干两件事。比如:
console.log(1)
setTimeout(() => console.log(2), 1000)
console.log(3)`
虽然 setTimeout
看起来是“异步的”,但本质上:
-
setTimeout
把回调函数登记给浏览器或 Node 的 “定时器模块”; -
JS 主线程继续执行;
-
等 1 秒后,事件循环机制(Event Loop) 将回调函数“推”到 JS 主线程队列中执行。
所以 JS 本身没有“异步线程”,异步操作是环境提供的能力(浏览器/Node 的 Web APIs)。
🔹 2. 所有异步行为,归根结底都是「延迟执行的回调函数」
举例:Promise
、setTimeout
、fetch
、async/await
,都可以还原为回调逻辑。
setTimeout(() => console.log('A'), 1000)
==就是注册一个回调函数==,延迟执行。
🔹 3. Promise
也只是对“回调”的封装
new Promise((resolve) => { setTimeout(() => { resolve('done') }, 1000) }).then(result => { console.log(result) })
核心仍然是:注册回调,只不过 .then
把回调收敛到一个更好管理的语法结构中。