Как работает этот механизм в javascript?
Недавно увидел одну задачу про композицию функций на javasccript и захотел ее решить. Поломав голову пару часов, я пришел к решению
function sum(a, b) {
return a + b;
}
function multiply(a, b) {
return a * b;
}
function minus(a, b) {
return a - b;
}
function divide(a, b) {
return a / b;
}
function x(obj) {
let result = 0;
let n = {}
for(key in obj) {
const fn = obj[key];
n[`${key}`] = (a, b) => {
result = fn((b === undefined ? result : a),
(b === undefined ? a : b));
return n;
}
}
n.exept = () => {
return result;
}
return n;
}
const c = x({
sum: sum,
multiply: multiply,
minus: minus,
divide: divide,
});
console.log(c.sum(10, 10).sum(10).divide(2).multiply(3).exept())
Но во время решения я столкнулся с одной трудностью, которая и застопорила меня, а именно такая реализация функции x
function x(obj) {
let result = 0;
let n = {}
for(key in obj) {
n[`${key}`] = (a, b) => {
result = obj[key]((b === undefined ? result : a),
(b === undefined ? a : b));
return n;
}
}
n.exept = () => {
return result;
}
return n;
}
Можете пожалуйста объяснить этот механизм, почему если написать
result = obj[key]((b === undefined ? result : a),
(b === undefined ? a : b));
То ко всем новым свойствам объекта n присваивается последняя функция объекта obj, но если выполнить такое присваивание
const fn = obj[key];
n[`${key}`] = (a, b) => {
result = fn((b === undefined ? result : a),
(b === undefined ? a : b));
return n;
}
То всё в норме