Я искал решение головоломки на CodeWars, и я не понимаю, почему это работает. Как работает минус ()?
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
javascript
TypeleveN
источник
источник
Ответы:
Это немного сложно. :-)
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
возвращается.Вот инструментальная версия:
Показать фрагмент кода
источник
Это на самом деле не так сложно, если вы работаете через это шаг за шагом. Давайте работать изнутри. Вызов:
без параметра означает, что вы передаете неопределенное значение как func. Это то же самое, что сказать:
Когда makeNum видит, что func не определен, он возвращает num, что равно 3.
Итак, мы сократили это до:
Теперь посмотрим как
оценивает. Минус видит, что заданный вами параметр равен 3, поэтому он возвращает функцию, которая может принять «левый» параметр и вычесть 3, которые мы уже предоставили из него. Это НЕ выполняет. Он просто сидит там, ожидая вызова с «левым» параметром, чтобы вычесть из него 3.
Итак, мы сократили это до:
Теперь посмотрим, как это оценивается. восьмерка вызывается с параметром func, являющимся этой функцией:
Затем он передает 8 и эту функцию makeNum, когда он говорит:
Затем makeNum видит, что func был предоставлен (и поэтому не определен), и возвращает func (num) обратно в восьмую функцию, что аналогично передаче:
вернуться к восьми функциям. Функция восьмерки получает это значение и затем возвращает его. Итак, мы сократили это до:
который регистрируется в консоли.
источник
minus
возвращает новую функцию для каждого вызова с параметрами, передаваемыми ей Когда возвращаемая функция вызывается, она может ссылаться на параметры, переданные при вызове, в дополнение к любым параметрам, переданным ей. Это один из способов карри функций в JavaScript.источник
Этот код является примером функций высшего порядка в функциональных языках программирования, таких как js. Функции Javascript рассматриваются как объекты, и их тоже можно передавать и возвращать.
minus
возвращает анонимную ( функцию без определенного имени ) функцию в основном как:Эта функция при
eight
вызове вызывается как,func(8)
которая затем дает результат как5
источник
Еще один способ взглянуть на это - вы можете переписать эту строку:
В виде:
источник