← Назад к вопросам
Является ли чистой функция возвращающая console.log('Привет')?
1.0 Junior🔥 191 комментариев
#JavaScript Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Чистая функция и console.log
Нет, это не чистая функция. Функция, выполняющая console.log("Привет"), не является чистой, потому что она имеет побочный эффект (side effect).
Что такое чистая функция
Чистая функция — это функция, которая:
- Для одних и тех же входных данных всегда возвращает одно и то же значение
- Не имеет побочных эффектов — не модифицирует внешнее состояние (переменные, DOM, базу данных и т.п.)
// ✅ Чистая функция
function add(a: number, b: number): number {
return a + b;
}
console.log(add(2, 3)); // 5
console.log(add(2, 3)); // 5 — всегда одинаковый результат
Почему console.log делает функцию нечистой
// ❌ Нечистая функция — побочный эффект (console.log)
function greet(name: string): void {
console.log(`Привет, ${name}`);
return;
}
greet("Алиса");
greet("Алиса");
// Побочный эффект: в консоли появились две строки
// Функция выполнила действие вне своей области видимости
Побочные эффекты включают:
- console.log, console.error — вывод в консоль
- Изменение переменных вне функции — глобальных или переданных параметром объектов
- Сетевые запросы — fetch, axios и т.п.
- Запись в БД — изменение состояния хранилища
- Изменение DOM — document.querySelector().innerHTML и т.п.
- setTimeout, setInterval — асинхронные операции
- Случайные числа — Math.random()
Примеры нечистых функций
let counter = 0;
// ❌ Нечистая: зависит от внешней переменной
function increment(): number {
counter++; // Изменяет глобальное состояние
return counter;
}
// ❌ Нечистая: побочный эффект (console.log)
function processData(data: any[]): void {
console.log("Обработка данных..."); // Побочный эффект
console.log(data);
return;
}
// ❌ Нечистая: зависит от Date.now()
function getTimestamp(): number {
return Date.now(); // Каждый раз разный результат
}
// ❌ Нечистая: случайные числа
function getRandomId(): number {
return Math.random(); // Не детерминирована
}
// ❌ Нечистая: побочный эффект (изменение DOM)
function renderMessage(message: string): void {
document.body.innerHTML += `<p>${message}</p>`;
}
// ❌ Нечистая: побочный эффект (сетевой запрос)
function fetchUser(userId: number): Promise<User> {
return fetch(`/api/users/${userId}`).then(r => r.json());
}
Примеры чистых функций
// ✅ Чистая: не зависит ни от чего, не имеет побочных эффектов
function multiply(a: number, b: number): number {
return a * b;
}
// ✅ Чистая: работает только с переданными параметрами
function capitalize(text: string): string {
return text.charAt(0).toUpperCase() + text.slice(1);
}
// ✅ Чистая: преобразует объект без изменения оригинала
function addProperty<T extends object>(obj: T, key: string, value: any): T & Record<string, any> {
return { ...obj, [key]: value };
}
// ✅ Чистая: фильтрация массива создаёт новый
function filterEven(numbers: number[]): number[] {
return numbers.filter(n => n % 2 === 0);
}
// ✅ Чистая: сортировка с созданием копии
function sortArray(arr: number[]): number[] {
return [...arr].sort((a, b) => a - b);
}
// ✅ Чистая: трансформация данных
function calculateTotal(items: Array<{ price: number; quantity: number }>): number {
return items.reduce((sum, item) => sum + (item.price * item.quantity), 0);
}
Чистые функции в React
// ✅ Чистый компонент (функциональный компонент без побочных эффектов)
interface GreetingProps {
name: string;
}
export function Greeting({ name }: GreetingProps) {
// Эта функция чистая, если нет эффектов в useEffect
return <div>Привет, {name}!</div>;
}
// ❌ Нечистый компонент (побочные эффекты в теле компонента)
export function BadGreeting({ name }: GreetingProps) {
console.log("Компонент отрисовался"); // Побочный эффект
return <div>Привет, {name}!</div>;
}
// ✅ Правильное место для побочных эффектов — useEffect
export function GoodComponent({ id }: { id: string }) {
const [data, setData] = useState(null);
useEffect(() => {
// Побочные эффекты здесь — это нормально
const fetchData = async () => {
const response = await fetch(`/api/data/${id}`);
const json = await response.json();
setData(json);
};
fetchData();
}, [id]);
return <div>{JSON.stringify(data)}</div>;
}
Почему чистые функции важны
-
Тестируемость — легко писать тесты
test("add returns correct sum", () => { expect(add(2, 3)).toBe(5); }); -
Предсказуемость — одинаковый input = одинаковый output
-
Переиспользуемость — функция работает в любом контексте
-
Оптимизация — результат можно кэшировать (memoization)
const memoizedMultiply = useMemo(() => multiply(a, b), [a, b]); -
Паралельность — чистые функции безопасны в многопоточной среде
Функция с console.log уточнение
// Буквально то, что в вопросе
function example() {
return console.log("Привет");
}
// ❌ Нечистая функция, потому что:
// 1. console.log — побочный эффект
// 2. console.log возвращает undefined, не полезная информация
// 3. Функция выполняет действие (вывод в консоль) при каждом вызове
// Результат может выглядеть как:
// Привет
// undefined
example(); // Выполняет побочный эффект, возвращает undefined
example(); // Снова побочный эффект