早退模式核心是用否定条件提前中断函数以避免嵌套缩进。通过独立校验、线性平铺、配合错误提示或默认值,提升可读性与可维护性;适用于前置守卫场景,不适用于多分支业务逻辑。

早退模式(Early Return)在 JavaScript 中的核心思路是:用否定条件提前中断函数,避免层层缩进。它不追求“所有路径都走到底”,而是“错一个就立刻停”。这样代码从“箭头形”变成“直筒形”,读起来更顺,改起来更稳。
用否定判断代替嵌套 if
把“必须满足 A 且 B 且 C 才能执行主逻辑”改成“只要不满足 A、或不满足 B、或不满足 C,就马上 return”。每条校验独立、清晰,不再包裹在 else 里。
- 错误写法(三层嵌套):
if (user) {
if (user.token) {
if (user.role === 'admin') {
doAdminTask();
}
}
} - 早退写法(线性平铺):
if (!user) return;
if (!user.token) return;
if (user.role !== 'admin') return;
doAdminTask();
配合错误提示或默认值直接退出
早退不只是 return;,也可以 return false、throw 错误、或返回默认结果,让意图更明确。
- 校验失败时抛错:
if (!data) throw new Error('数据缺失');
if (!Array.isArray(data.items)) throw new Error('items 必须是数组'); - 提供兜底值:
if (typeof callback !== 'function') return console.warn('callback 非函数,跳过执行');
callback(result);
结合可选链与空值合并进一步简化
ES2020+ 的 ?. 和 ?? 可以把部分嵌套校验“压平”,和早退形成互补。
立即学习“Java免费学习笔记(深入)”;
- 代替深层属性访问的 if 嵌套:
// 原来要写三重 if 检查 user.profile.avatar
const avatar = user?.profile?.avatar ?? '/default.png'; - 早退 + 可选链组合:
if (!user?.id || !user?.email) return;
// 后续代码可放心使用 user.id 和 user.email
注意边界:早退不是万能的
早退适合“前置守卫”场景(权限、参数、状态检查),但不适合需要对比多个分支并选择其一的业务逻辑。比如菜单类型映射、支付渠道分发,用策略对象或 Map 查表比一堆 if return 更合适。
- 适合早退:
参数校验、登录态检查、资源可用性判断 - 不适合早退:
根据订单金额区间计算折扣率、按设备类型加载不同组件


















