同步:同步是指函数执行完毕后,能够立即得到想要的结果,或者说是能得到一个确定的返回。

异步:异步是函数执行完毕后,结果必须在未来经过某种手段才能获得(如 回调函数 等等)。

例如

settimeout(() => { console.log("哈哈哈")},5000)。

console.log("now")

其中,settimeout是主线程对工作线程的一个应用调用通知,执行次应用调用函数后会立即返回执行下面的js程序,但是箭头内部的console。log输出是在未来等待定时工作线程完成5秒的计时后通知主线程,然后执行输出。考虑的在底层一些,也就是eventloop函数轮转调用,console.log(“now”)会立即执行,而console.log(“哈哈哈”)是会在下一轮主线程循环时开始调用(5秒定时到后)

补充

补充:同步与异步的核心区别在于执行流是否会被阻塞,以及结果何时可用:

  • 同步 :调用发起后必须等到执行完才返回,期间主线程被阻塞;
  • 异步 :调用立即返回,结果通过回调 / Promise / await 等机制在未来拿到,主线程可继续执行其他任务。

JS 是单线程语言,异步通过"事件循环(Event Loop)+ 任务队列"实现:宏任务(setTimeout / I/O 等)与微任务(Promise.then / queueMicrotask)交替调度,微任务优先于下一个宏任务执行。

console.log('1')
setTimeout(() => console.log('2'), 0)
Promise.resolve().then(() => console.log('3'))
console.log('4')
// 输出顺序:1 4 3 2
// 解释:1/4 同步 -> 微任务 3 -> 宏任务 2

来源整理自:vue3js.cn 面试官系列