Javascript中匿名函数的递归调用

) console.log(fact(5)) //120// 既然不让这个函数有名字,我们就先给这个递归方法一个叫做self的代号// 首先是一个接受这个递归函数作为参数的一个高阶函数const fact_gen = (self) => (n) => n<=1?1:n*self(n-1) console.log(fact_gen(fact)(5)) //120// 我们是将递归方法和参数n,都传入递归方法,得到这样一个函数const fact1 = (self, n) => n<=1?1:n*self(self, n-1) console.log(fact1(fact1, 5)) //120// 我们将fact1 柯理化,得到fact2const fact2 = (self) => (n) => n<=1?1:n*self(self)(n-1) console.log(fact2(fact2)(5)) //120// 惊喜的事发生了,如果我们将self(self)看做一个整体// 作为参数传入一个新的函数: (g)=> n<= 1? 1: n*g(n-1)const fact3 = (self) => (n) => ((g)=>n <= 1?1:n*g(n-1))(self(self)) console.log(fact3(fact3)(5)) //120// fact3 还有一个问题是这个新抽离出来的函数,是上下文有关的// 他依赖于上文的n, 所以我们将n作为新的参数// 重新构造出这么一个函数: (g) => (m) => m<=1?1:m*g(m-1)const fact4 = (self) => (n) => ((g) => (m) => m<=1?1:m*g(m-1))(self(self))(n) console.log(fact4(fact4)(5))// 很明显fact4中的(g) => (m) => m<=1?1:m*g(m-1) 就是 fact_gen// 这就很有意思啦,这个fact_gen上下文无关了, 可以作为参数传入了const weirdFunc = (func_gen) => (