异步操作(如 setTimeout、fetch、事件处理等)在当前调用栈完成后才执行。
当尝试这样做时:
function sum(a, b) {
let result;
setTimeout(() => {
result = a + b;
}, 1000);
return result; // 这里返回的是 undefined,因为 setTimeout 还没执行
}
const value = sum(1, 2);
console.log(value); // undefined
这是因为 setTimeout
会将回调函数放入事件队列,主线程继续执行后续代码,不会等待回调完成。
return
语句的同步本质
return
语句本身是同步操作,它的行为遵循以下规则:
-
立即执行:当 JavaScript 引擎遇到
return
语句时,会立即停止当前函数的执行,并将指定的值返回给调用者。 -
调用栈展开:
return
会导致当前函数从调用栈中弹出,控制权回到调用该函数的地方。
-
无法跨异步边界:
return
只能将值返回给直接调用它的同步代码,无法将值返回到已经执行完毕的函数外部。异步操作中的
return
行为在异步操作(如
setTimeout
、Promise、回调函数)中,return
语句的作用域仅限于异步回调函数内部:function asyncOperation() { -
setTimeout(() => {
-
return 42; // 这个 return 只影响 setTimeout 的回调函数 }, 1000);
-
// 此时 setTimeout 已经执行完毕,但回调尚未触发}
-
const result = asyncOperation();
-
console.log(result); // undefined,因为 asyncOperation 没有显式返回值