Sum函数:

    1. const sum = (n) => {
    2. if (n <= 1) return n;
    3. return n + sum(n-1)
    4. }

    尾递归:

    const sum = (n, prevSum = 0) => {
      if (n <= 1) return n + prevSum;
      return sum(n-1, n + prevSum)
    }
    

    尾递归+蹦床

    const sum0 = (n, prevSum = 0) => {
      if (n <= 1) return n + prevSum;
      return () => sum0(n-1, n + prevSum)//改造1. 返回函数闭包,创造新匿名函数并创造新的sum0,
      否则会把参数注入到原始u的sum0中
    }
    const trampoline = f => (...args) => {
      let result = f(...args);
      while (typeof result === 'function') {
        result = result();
      }
      return result;
    }
    const sum = trampoline(sum0);
    
    console.log(sum(1000000)); // 不会栈溢出
    

    蹦床es5

    function trampoline(f) {
      return function trampolined(...args) {
        let result = f.bind(null, ...args);
    
        while (typeof result === 'function') result = result();
    
        return result;
      };
    }