Этот вопрос проверяет понимание фундаментальной концепции функционального программирования — чистоты функций, что критически важно для предсказуемости кода.
Чистая функция (Pure function) — это функция, которая при одинаковых входных аргументах всегда возвращает одинаковый результат и не имеет побочных эффектов (не изменяет внешнее состояние или переданные ей аргументы). Ее работа зависит только от своих входных данных, что делает ее поведение предсказуемым и легко тестируемым.
Чистые функции — это краеугольный камень функционального программирования и написания надежного кода.
Детерминированность: Для одних и тех же аргументов всегда возвращает один и тот же результат. Не зависит от скрытого состояния или изменяющихся внешних данных (например, глобальных переменных, текущего времени).
Отсутствие побочных эффектов (Side Effects): Не производит наблюдаемых изменений вне функции. Это означает, что она:
Не изменяет свои входные аргументы.
Не модифицирует глобальные переменные.
Не выполняет операций ввода-вывода (например, запросы к сети, чтение файлов).
Не вызывает Math.random() или Date.now() (так как их результат непредсказуем).
// ЧИСТАЯ ФУНКЦИЯ
function add(a, b) {
return a + b;
}
// Всегда: add(2, 3) => 5. Ничего не меняет.
// НЕЧИСТАЯ ФУНКЦИЯ
let counter = 0;
function increment() {
counter++; // Побочный эффект: изменение внешней переменной
}
// НЕЧИСТАЯ ФУНКЦИЯ
function getRandomNumber() {
return Math.random(); // Результат разный при каждом вызове.
}
// НЕЧИСТАЯ ФУНКЦИЯ
function saveUser(user) {
fetch('/api/users', { // Побочный эффект: сетевой запрос (IO)
method: 'POST',
body: JSON.stringify(user)
});
}Предсказуемость: Легко понять, что делает функция.
Тестируемость: Не требуется сложная настройка окружения. Достаточно передать аргументы и проверить результат.
Переиспользование: Их можно безопасно использовать в разных частях приложения.
Кеширование: Результат можно закешировать (мемоизировать) на основе аргументов, чтобы избежать повторных вычислений.
Стремитесь к написанию чистых функций везде, где это возможно, так как они делают код более стабильным и понятным. Нечистые функции (например, для взаимодействия с DOM, сетью или глобальным состоянием) следует изолировать и явно идентифицировать.