Функция с методами, помогите найти ошибку
Задача такова : Функция должна вернуть объект, у которого должно быть несколько методов: sum - складывает number с переданными аргументами dif - вычитает из number переданные аргументы div - делит number на первый аргумент. Результат делится на следующий аргумент (если передан) и так далее mul - умножает number на первый аргумент. Результат умножается на следующий аргумент (если передан) и так далее
Решил я это вот так
let calc = function calculator(number) {
let result = number;
let obj = {
sum : function () {
for (let i=0; i<arguments.length; i++) {
result+=arguments[i];
}
return result;
},
dif : function () {
for (let i=0; i<arguments.length; i++) {
result -= arguments[i];
}
return result;
},
div : function () {
for (let i=0; i<arguments.length; i++) {
if (arguments[i] == 0) {
throw new Error('Na nol delit nelzya!');
} else {
result /= arguments[i];
}
}
return result;
},
mul : function () {
for (let i=0; i<arguments.length; i++) {
result *= arguments[i];
}
return result;
},
}
return obj;
}
let calcfn = calc;
let mycalc = calcfn(10);
console.log(mycalc.sum(3,2)); // 15
try {
console.log(mycalc.div(2)); // 7.5
} catch (e) {
console.error(e.message);
}
Но проблема заключается в том, что второй метод, у меня например это деление, выполняется не от 10, которая передана в number, а от результата суммы. Что можно сделать, чтобы все методы выполнялись от переданного в качестве аргумента числа, а не от предыдущего результата выполнения?
Ответы (1 шт):
Прочитайте про области видимости переменных, как вариант внести let result = number в сами функции sum, dif, div, mul.
Есть и другие варианты решения, но судя по вашему коду ожидаемый результат отличается от действительного и поэтому лучше в рамках заданного вопроса почитать про области видимостей, затем можно изменить текущий код на более компактную и чистую реализацию
Для понимания областей видимости можете рассмотреть этот код:
let calc = function calculator(number) {
//let result = number;
let obj = {
sum : function () {
let result = number;
for (let i=0; i<arguments.length; i++) {
result+=arguments[i];
}
return result;
},
div : function () {
let result = number;
for (let i=0; i<arguments.length; i++) {
if (arguments[i] == 0) {
throw new Error('Na nol delit nelzya!');
} else {
result /= arguments[i];
}
}
return result;
},
}
// ... остальные функции
return obj
}
let calcfn = calc;
let mycalc = calcfn(10);
console.log(mycalc.sum(3,2)); // вернет 15
try {
console.log(mycalc.div(2)); // вернет 5
} catch (e) {
console.error(e.message);
}