Побочные эффекты

Любое взаимодействие функции с внешним миром помимо возврата значения.

Зачем нужно

Понимание side effects — ключ к предсказуемому коду. Чистые функции без побочных эффектов легче тестировать, кэшировать и отлаживать. Эффекты нужно изолировать.

Где используется

  • Архитектура приложений (разделение логики и IO)
  • Тестирование (мокирование эффектов)
  • Функциональные фреймворки (Redux, Elm)

Code

// Побочные эффекты — примеры:
// 1. Мутация внешней переменной
let count = 0;
function increment() { count++; } // side effect!

// 2. Запись в DOM
function render(text) { document.body.innerHTML = text; }

// 3. HTTP-запрос
async function saveUser(user) { await fetch('/api', { body: user }); }

// 4. console.log
function add(a, b) { console.log(a + b); return a + b; } // side effect

// Без побочных эффектов (чистая)
function pureAdd(a, b) { return a + b; }

// Изоляция эффектов: эффект снаружи, логика внутри
// Плохо:
function processAndSave(data) {
  const result = transform(data); // логика
  fs.writeFileSync('out.json()', JSON.stringify(result)); // эффект
}

// Хорошо:
function process(data) { return transform(data); } // чистая
const result = process(data);
fs.writeFileSync('out.json()', JSON.stringify(result)); // эффект отдельно

// React: useEffect — контейнер для побочных эффектов

Связанные темы

Ресурсы