Рішення Codewars - Функції, що діють один на одного, вкладені [закрито]


11

Я дивився на розгадку головоломки на кодоварі і не розумію, чому це працює. Як працює мінус ()?

function makeNum(num, func) {
    if (func === undefined) {
        return num;
    } else {
        return func(num);
    }
}

function three(func) {
    return makeNum(3, func);
}

function eight(func) {
    return makeNum(8, func);
}

function minus(right) {
    return function(left) {
        return left - right;
    };
}

console.log(eight(minus(three()))); // will log out 5


Ось подібне питання з дещо іншим підходом, який може допомогти пролити трохи світла на те, як це працює
Нік Парсонс

1
Я проголосував за те, щоб закрити це після провалу ревізії перевірки: мені було очевидно, що ви цього не розуміли. Було б краще, якщо його редагують, щоб пояснити, чому ви думаєте, мінус не повинен працювати.
GS - Вибачте Моніку

Відповіді:


8

Це трохи складно. :-)

console.log(eight(minus(three()))); запускається зсередини назовні, тому перейдемо до цього:

  • three()- дзвонить makeNum(3, undefined)і повертає те, що повертається. makeNum(3, undefined)повертає 3, так що це повернене значення.
  • minus(3)- дзвінки minus, передаючи 3як right. minusповертає нову функцію, яка закривається right.
  • eight(...)- дзвінки, makeNum(8, fnFromMinus)де fnFromMinusфункція, яку було повернуто minus(3). makeNum(8, fnFromMinus)робить fnFromMinus, передаючи 8як left. fnFromMinusповертає результат left - right(пам'ятаєте , що rightце 3, fnFromMinusзімкнулася над ним).

Так як 8 - 3це 5, кінцевий результат 5, який console.logповертається.

Ось інструментальна версія:


2

Насправді це не так вже й складно, якщо ви працюєте через нього поетапно. Давайте працювати зсередини назовні. Дзвінки:

three()

без параметра означає, що ви передаєте невизначене значення як функцію. Отже, це те саме, що говорити:

makeNum(3, undefined)

Коли makeNum бачить, що функція не визначена, вона повертає число, яке дорівнює 3.

Тож ми зменшили це до:

eight(minus(3))

Тепер подивимося, як

minus(3)

оцінює. мінус бачить, що вказаний вами параметр дорівнює 3, тому він повертає функцію, яка може прийняти параметр "ліворуч" і відняти 3, які ми вже надали з нього. Він НЕ виконує. Він просто сидить там і чекає, коли його зателефонують із параметром "ліворуч", щоб він міг відняти з нього 3

Тож ми зменшили це до:

eight(function(left){
    return left - 3;
})

Тепер давайте подивимось, як це оцінює. вісім викликається, при цьому функція функціонує:

function(left){
    return left - 3;
}

Потім він проходить 8, і ця функція makeNum коли говорить:

makeNum(8, func)

Потім makeNum бачить, що функцію надано (і тому не визначено) і повертає функцію (число) назад до восьми функцій, що це те саме, що передача:

8 - 3

повернутися до восьми функцій. Вісім функцій отримує це значення, а потім повертає його. Тож ми зменшили це до:

5

який входить у консоль.


0

minusповертає нову функцію для кожного виклику з параметрами, переданими до нього, захопленим. Коли викликається повернута функція, вона може посилатися на параметри, передані при виклику, на додаток до будь-яких параметрів, переданих їй. Це один із способів каррі функцій у JavaScript.


0

Цей код є прикладом функцій вищого порядку в таких функціональних мовах програмування, як js. Функції Javascript розглядаються як об'єкти, і вони також можуть передаватися та повертатися.

Функція вищого порядку - це функція, яка отримує функцію як аргумент або повертає функцію як вихід.

minusповертає анонімну ( функція без визначеного імені ) функцію в основному як:

function(left) {
        return left - 3; //right = 3
    };

Ця функція при переході до eightвикликається тим, func(8)що дає результат як5


0

Ще один спосіб подивитися на це - ви можете переписати цей рядок:

console.log(eight(minus(three())));

Як:

const threeResult = three(); // = 3
const minusResult = minus(threeResult); // = a function that subtracts 3
const eightResult = eights(minusResult); // = 5
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.