Ответ
Чистая функция — это функция, которая всегда возвращает одинаковый результат для одних и тех же входных данных и не имеет побочных эффектов (не изменяет внешнее состояние).
Характеристики:
- Детерминированность — результат зависит только от входных аргументов.
- Отсутствие побочных эффектов — не изменяет глобальные переменные, не делает API-запросов, не модифицирует DOM и т.д.
Пример чистой функции:
function sum(a, b) {
return a + b;
}
Пример НЕчистой функции:
let counter = 0;
function increment() {
counter++; // Изменяет внешнюю переменную
return counter;
}
Чистые функции предсказуемы, легко тестируются и оптимизируются. Их часто используют в Redux-редюсерах и функциональном программировании.
Ответ 18+ 🔞
Да ты послушай, что за мода пошла — про эти «чистые функции» рассуждать, будто про монашек в монастыре. Ну ладно, раз уж спросил, сейчас разжуём.
Представь себе такую картину: есть у тебя функция, как автомат с газировкой советский. Кинул пятак — получил стакан «Буратино». Кинул ещё один пятак — опять «Буратино». И хоть ты весь день там пляши, она тебе всегда, блядь, один и тот же напиток за одни и те же деньги выдаст. Это и есть чистота, ёпта! Детерминированность, как они умно говорят. Результат только от того, что ты в неё сунул, и больше ни от какой хуйни.
А теперь смотри, чем она НЕ страдает:
- Не шарит по твоим глобальным переменным, как вор по карманам.
- Не строчит запросы куда-то на сервер, пока ты не видишь.
- Не лезет в DOM, перекрашивая кнопки в розовый цвет просто потому, что ей скучно.
- Короче, никаких побочных эффектов. Сидит себе тихо, как сыч, жрёт аргументы и выдаёт результат. И всё.
Вот, смотри, пример святой, блядь, чистоты:
function sum(a, b) {
return a + b;
}
Что сюда ни подай — 2 и 3, 5 и 10 — всегда посчитает честно и никуда не денется. Предсказуемая, как день зарплаты перед увольнением.
А теперь, для контраста, глянь на эту шлюху:
let counter = 0;
function increment() {
counter++; // Трогает внешнюю переменную! Побочный эффект!
return counter;
}
Вызвал раз — counter стал 1. Вызвал два — уже 2. А кто его знает, что у неё в counter было до этого? Может, другой кусок кода там уже накидал? Непредсказуемость, пиздец! Тестировать такую — одно мучение.
Вот за что их, чистых-то, любят: их хоть наизусть учи, хоть тестами обкладывай — они не подведут. В том же Redux редюсеры — так те вообще обязаны быть чистыми, иначе state твой превратится в бардак, хуже чем в моей тумбочке.
Короче, суть: хочешь меньше геморроя — пиши функции, которые как автомат: взял аргументы, выдал результат, и ни тебе сюрпризов, ни изменений в окружающем мире. Всё, как у людей.