Pure function là hàm thỏa mãn 3 điều kiện:
- Deterministic: Cùng input → luôn cùng output.
- No side effects: Không thay đổi state bên ngoài (biến global, DOM, network, console.log, mutate argument...).
- Chỉ phụ thuộc input: Không đọc biến ngoài scope.
Ví dụ KHÔNG phải pure function
1. Phụ thuộc biến ngoài
let val1 = 6, val2 = 4;
function notPure() {
return val1 * val2; // Đọc biến global
}
2. Gây side effect (mutate argument)
function notPure2(arr) {
arr.push(99); // Mutate input array — side effect!
return arr.length;
}
3. Phụ thuộc trạng thái bên ngoài
function notPure3(arg) {
let val = 100; // Biến cục bộ nhưng không phải input
return val * arg;
}
Ví dụ Pure Function
function pure(arg) {
return 4 * arg; // Chỉ dùng arg, không side effect, deterministic
}
pure(2); // 8 — luôn 8 với input 2
Lợi ích của Pure Function
| Lợi ích | Giải thích |
|---|---|
| Dễ test | Không cần mock, setup state — chỉ gọi hàm với input. |
| Cacheable (Memoization) | Cùng input → cùng output → lưu kết quả tái dùng. |
| Parallelizable | Không shared state → chạy song song an toàn. |
| Dễ debug | Output chỉ phụ thuộc input — trace dễ dàng. |
| Referential Transparency | Có thể thay lời gọi hàm bằng kết quả mà không đổi hành vi chương trình. |
Impure Function — Khi nào cần?
Thực tế app cần side effect: DOM manipulation, API call, logging, random, Date.now(). Mục tiêu: tách biệt pure logic khỏi impure shell.
Ví dụ tách biệt
// Pure core
function calculateTotal(items, taxRate) {
return items.reduce((sum, item) => sum + item.price, 0) * (1 + taxRate);
}
// Impure shell
function handleOrder() {
const items = fetchCartItems(); // Side effect: read DB
const total = calculateTotal(items, 0.1); // Pure
saveOrder(total); // Side effect: write DB
renderTotal(total); // Side effect: DOM
}