Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

Документы

Медиа

Назад
Вопрос про JavaScript: side effects, mutability, function arguments, pure function, unexpected behavior

Какие проблемы могут возникнуть при изменении входных аргументов функции внутри нее?

Вопрос проверяет понимание побочных эффектов и мутабельности данных, что критично для написания предсказуемого и поддерживаемого кода.

Короткий ответ

Изменение входных аргументов функции внутри её тела создаёт побочные эффекты, что делает поведение функции непредсказуемым и усложняет отладку. Это нарушает принцип чистых функций, так как функция начинает изменять состояние внешнего мира. Например, если массив, переданный в функцию, будет изменён, это повлияет на все остальные части программы, которые используют этот массив. Такой код сложно тестировать и рассуждать о его логике.

Длинный ответ

Изменение входных аргументов функции напрямую — это классический пример создания побочного эффекта (side effect). Функция, которая модифицирует свои параметры, перестаёт быть чистой (pure function), потому что её выполнение влияет на состояние программы за своими пределами. Это приводит к нескольким конкретным проблемам.

Основные проблемы

  • Непредсказуемость: Код, вызывающий функцию, может не ожидать, что переданные ему данные изменятся. Это приводит к тонким и трудноуловимым багам, особенно в больших кодовых базах или при асинхронных операциях.
  • Нарушение инкапсуляции: Функция начинает манипулировать данными, которые ей не принадлежат, что противоречит принципам модульного проектирования.
  • Сложность отладки и тестирования: Поскольку состояние системы изменяется скрытым образом, становится сложно отследить, где и почему данные были модифицированы. Чистые функции, напротив, всегда возвращают одинаковый результат для одних и тех же входных данных, что делает их идеальными для модульного тестирования.
  • Проблемы с параллельным выполнением: В многопоточных или асинхронных средах одновременная модификация одних и тех же данных из разных функций может привести к состоянию гонки (race condition) и повреждению данных.

Пример на JavaScript

Рассмотрим плохую и хорошую практику на примере функции, которая должна добавить налог к ценам в массиве.

// ПЛОХО: Функция мутирует входной аргумент
function addTaxBad(prices, taxRate) {
    for (let i = 0; i < prices.length; i++) {
        prices[i] = prices[i] * (1 + taxRate); // Прямое изменение массива!
    }
    // Функция ничего не возвращает, но массив `prices` в вызывающем коде уже изменён.
}

const cart = [100, 200, 300];
addTaxBad(cart, 0.2);
console.log(cart); // [120, 240, 360] - исходный массив безвозвратно потерян.

// ХОРОШО: Функция возвращает новый массив, не трогая исходный
function addTaxGood(prices, taxRate) {
    return prices.map(price => price * (1 + taxRate)); // Используем .map для создания нового массива
}

const originalCart = [100, 200, 300];
const cartWithTax = addTaxGood(originalCart, 0.2);
console.log(originalCart); // [100, 200, 300] - исходные данные целы
console.log(cartWithTax);   // [120, 240, 360] - новый массив с результатом

Где это применяется и как избежать проблем

Принцип неизменяемости (immutability) является краеугольным камнем в функциональном программировании и широко используется в современных фреймворках, таких как React (для состояния) и Redux. Чтобы избежать случайных мутаций:

  • Всегда рассматривайте входные аргументы как только для чтения.
  • Если нужно изменить данные, создавайте и возвращайте новую копию (используйте методы вроде .map(), .filter(), spread оператор [...arr], Object.assign({}, obj) или библиотеки типа Immer).
  • Явно документируйте функции, которые по дизайну должны менять свои аргументы (например, методы классов, работающие с внутренним состоянием).

Вывод: Избегайте изменения входных аргументов функции. Это делает код более предсказуемым, упрощает тестирование и отладку, а также предотвращает сложные ошибки, связанные с общим состоянием. Применяйте этот подход везде, где важна надёжность и поддерживаемость кода, особенно при работе с коллекциями данных и состоянием приложения.

Уровень

  • Рейтинг:

    4

  • Сложность:

    3

Навыки

  • JavaScript

    JavaScript

Ключевые слова

#side effects

#mutability

#function arguments

#pure function

#unexpected behavior

Подпишись на Python Developer в телеграм