← Назад к вопросам

Является ли чистой функция возвращающая console.log('Привет')?

1.0 Junior🔥 191 комментариев
#JavaScript Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Чистая функция и console.log

Нет, это не чистая функция. Функция, выполняющая console.log("Привет"), не является чистой, потому что она имеет побочный эффект (side effect).

Что такое чистая функция

Чистая функция — это функция, которая:

  1. Для одних и тех же входных данных всегда возвращает одно и то же значение
  2. Не имеет побочных эффектов — не модифицирует внешнее состояние (переменные, 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>;
}

Почему чистые функции важны

  1. Тестируемость — легко писать тесты

    test("add returns correct sum", () => {
      expect(add(2, 3)).toBe(5);
    });
    
  2. Предсказуемость — одинаковый input = одинаковый output

  3. Переиспользуемость — функция работает в любом контексте

  4. Оптимизация — результат можно кэшировать (memoization)

    const memoizedMultiply = useMemo(() => multiply(a, b), [a, b]);
    
  5. Паралельность — чистые функции безопасны в многопоточной среде

Функция с console.log уточнение

// Буквально то, что в вопросе
function example() {
  return console.log("Привет");
}

// ❌ Нечистая функция, потому что:
// 1. console.log — побочный эффект
// 2. console.log возвращает undefined, не полезная информация
// 3. Функция выполняет действие (вывод в консоль) при каждом вызове

// Результат может выглядеть как:
// Привет
// undefined

example(); // Выполняет побочный эффект, возвращает undefined
example(); // Снова побочный эффект