Guard Clauses
Handling an edge case with an early return at the top of a function, instead of nesting the normal-case logic inside a conditional.
Purpose
A guard clause checks for an edge case at the very top of a function and returns (or continues,
or breaks) immediately, so the rest of the function can handle only the normal case without
nesting inside a conditional.
Example
// Nested — nesting grows with every additional condition
function describeUser(user) {
if (user) {
if (user.isActive) {
return `${user.name} is active`;
} else {
return `${user.name} is inactive`;
}
} else {
return 'No user';
}
}
// Guard clauses — each edge case exits early, main logic stays flat
function describeUserGuarded(user) {
if (!user) return 'No user';
if (!user.isActive) return `${user.name} is inactive`;
return `${user.name} is active`;
}
When it helps
- A function has one or more preconditions (an argument might be missing, a collection might be empty) that are exceptions to the main logic, not variations of it.
- Nesting would otherwise grow with every additional edge case handled.
Common mistakes
- Treating an early return as “skipping” validation — it’s the opposite: the edge case is handled explicitly and immediately, which is what lets the remaining code assume the normal case safely.
- Overusing guard clauses for branches that are genuinely part of the main logic (not edge cases), which can fragment a function’s actual behavior across many early returns.
Runtime notes
A coding pattern, not a language feature — behaves identically anywhere JavaScript runs.