Sobes.tech
Назад к вопросам
Middle+
1

Посмотрите на код с классом, у которого есть конструктор с полем multiplier, метод add для добавления чисел в массив и метод getMultiSum, реализованный через обычную function. Что выведется в консоли при запуске этого кода?

Компании, где спрашивали
Т-БанкТ-Банк

Ответ от нейросети

sobes.tech AI

Если метод getMultiSum реализован через обычную function, а не стрелочную, то внутри него this не будет ссылаться на экземпляр класса, а будет либо undefined (в строгом режиме), либо глобальным объектом (в нестрогом). В результате, при попытке доступа к this.multiplier или this.numbers внутри такого метода возникнет ошибка или undefined.

Пример:

class Example {
  constructor(multiplier) {
    this.multiplier = multiplier;
    this.numbers = [];
  }

  add(num) {
    this.numbers.push(num);
  }

  getMultiSum() {
    return this.numbers.reduce(function(sum, num) {
      return sum + num * this.multiplier; // this здесь не тот, что ожидается
    }, 0);
  }
}

const ex = new Example(2);
ex.add(1);
ex.add(2);
console.log(ex.getMultiSum()); // Ошибка или NaN

Чтобы исправить, можно использовать стрелочную функцию внутри reduce, которая захватывает this из внешнего контекста:

getMultiSum() {
  return this.numbers.reduce((sum, num) => sum + num * this.multiplier, 0);
}

Или сохранить this в переменную self перед вызовом функции.