Middle+
გთხოვთ, ნახოთ კოდი კლასი, რომელსაც აქვს კონსტრუქტორი, სადაც არის მულტიპლაიერი, მეთოდი add, რომელიც ემატება რიცხვებს მასივში და მეთოდი getMultiSum, რომელიც განხორციელებულია ჩვეულებრივი ფუნქციის საშუალებით. რა გამოიტანება კონსოლში ამ კოდის გაშვებისას?
sobes.tech AI
პასუხი 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 перед вызовом функции.