Trace the function 'thrice' - 函数抽象

Trace the function 'thrice' - Function abstraction

我在做作业的时候遇到了下面的代码。我可以理解为什么表达式 (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

内部(三次):

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));

Outer (add1) 将 add1 函数引入作用域。

声明 0 后,add1 将其作为 k 插入。 add1 函数解析。

K 现在是一个。 我们现在回到原来的 () 中。 变量 n 现在等于 1。

function2 或 (fun2) 变为 add1。

然后外'fun'变成add1.

一三次的整return=3.

第一次发生外部三次,内部三次 return 就是三个。

第二次迭代,是三*三。

终于跟上次了,九*三。