Это на самом деле не так сложно, если вы работаете через это шаг за шагом. Давайте работать изнутри. Вызов:
three()
без параметра означает, что вы передаете неопределенное значение как func. Это то же самое, что сказать:
makeNum(3, undefined)
Когда makeNum видит, что func не определен, он возвращает num, что равно 3.
Итак, мы сократили это до:
eight(minus(3))
Теперь посмотрим как
minus(3)
оценивает. Минус видит, что заданный вами параметр равен 3, поэтому он возвращает функцию, которая может принять «левый» параметр и вычесть 3, которые мы уже предоставили из него. Это НЕ выполняет. Он просто сидит там, ожидая вызова с «левым» параметром, чтобы вычесть из него 3.
Итак, мы сократили это до:
eight(function(left){
return left - 3;
})
Теперь посмотрим, как это оценивается. восьмерка вызывается с параметром func, являющимся этой функцией:
function(left){
return left - 3;
}
Затем он передает 8 и эту функцию makeNum, когда он говорит:
makeNum(8, func)
Затем makeNum видит, что func был предоставлен (и поэтому не определен), и возвращает func (num) обратно в восьмую функцию, что аналогично передаче:
8 - 3
вернуться к восьми функциям. Функция восьмерки получает это значение и затем возвращает его. Итак, мы сократили это до:
5
который регистрируется в консоли.