Как работает этот механизм в 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;
}

То всё в норме


Ответы (0 шт):