同步与异步的区别
JavaScript 中同步和异步执行的区别与应用场景
问题
解释 JavaScript 中同步和异步的区别。
解答
同步执行
代码按顺序执行,前一行执行完才执行下一行。如果某行代码耗时较长,后续代码必须等待。
console.log('1');
console.log('2');
console.log('3');
// 输出顺序:1, 2, 3
同步阻塞示例:
console.log('开始');
// 模拟耗时操作(阻塞 3 秒)
const start = Date.now();
while (Date.now() - start < 3000) {}
console.log('结束'); // 3 秒后才执行
// 页面在这 3 秒内完全卡死
异步执行
代码不会阻塞后续执行,耗时操作完成后通过回调处理结果。
console.log('开始');
// 异步操作,不阻塞
setTimeout(() => {
console.log('异步任务完成');
}, 3000);
console.log('结束');
// 输出顺序:开始, 结束, 异步任务完成
常见异步场景
// 1. 定时器
setTimeout(() => console.log('timeout'), 0);
// 2. 网络请求
fetch('/api/data')
.then(res => res.json())
.then(data => console.log(data));
// 3. 事件监听
button.addEventListener('click', () => {
console.log('clicked');
});
// 4. Promise
new Promise(resolve => {
resolve('done');
}).then(result => console.log(result));
// 5. async/await
async function getData() {
const res = await fetch('/api/data');
return res.json();
}
执行顺序示例
console.log('1'); // 同步
setTimeout(() => {
console.log('2'); // 宏任务
}, 0);
Promise.resolve().then(() => {
console.log('3'); // 微任务
});
console.log('4'); // 同步
// 输出顺序:1, 4, 3, 2
// 同步代码先执行,然后微任务,最后宏任务
关键点
- 同步:按顺序执行,会阻塞后续代码
- 异步:不阻塞,通过回调/Promise 处理结果
- 为什么需要异步:JavaScript 单线程,异步避免页面卡死
- 执行顺序:同步代码 → 微任务(Promise)→ 宏任务(setTimeout)
- 常见异步 API:setTimeout、fetch、Promise、事件监听
目录