2016-08-27 4 views
0

Когда я выполнял свое задание, я столкнулся со следующим кодом. Я могу понять, почему выражение (thrice(add1))(0) оценивается до 4. Если мы определим f(x) = x + 1, то (thrice(add1))(0) будет оцениваться как f(f(f(x))), который равен ((x+1)+1)+1. Однако я не совсем понимаю, почему ((thrice(thrice))(add1))(0) оценил бы 27, а не 3*3=9.Отслеживать функцию «трижды» - абстракция функции

//Javascript 
function thrice(f) { 
    return compose(compose(f, f), f); 
} 

function compose(fun,fun2) { 
    return function (n) { 
     return fun(fun2(n)); 
    }; 
} 
function add1(k) { 
    return k + 1; 
} 

console.log(((thrice(thrice))(add1))(0)); //27 

console.log((thrice(add1))(0)); //3 

ответ

0

Внутренний (трижды):

thrice(1) returns ---> function (n) { return fun(fun2(n)); 

Наружный (трижды):

thrice(1) returns ---> function (n) { return fun(fun2(n)); 
thrice(1) returns ---> function (n) { return fun(fun2(n)); 
thrice(1) returns ---> function (n) { return fun(fun2(n)); 

Наружный (add1) вводит функцию add1 к области действия.

Когда объявленные 0, add1 вставляет его как k. Функция add1 разрешает.

K сейчас один. Теперь мы вернулись к оригиналу(). Переменная n теперь равна единице.

Функция2 или (fun2) становится add1.

Тогда наружное 'fun' становится add1.

Полное возвращение одного три раза = 3.

В первый раз, когда происходит трижды трижды, трижды возвращается три.

Второй раз, когда он итерации, это три * три.

И наконец, в последний раз это девять * три.