Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Pure Function (Hàm thuần khiết) trong JavaScript

Pure function là hàm thỏa mãn 3 điều kiện:

  1. Deterministic: Cùng input → luôn cùng output.
  2. No side effects: Không thay đổi state bên ngoài (biến global, DOM, network, console.log, mutate argument...).
  3. 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 íchGiải thích
Dễ testKhô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.
ParallelizableKhông shared state → chạy song song an toàn.
Dễ debugOutput chỉ phụ thuộc input — trace dễ dàng.
Referential TransparencyCó 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
}