Menu

es6中尾调函数之蹦床函数

2018年4月23日 - php

蹦床函数

另一个优化方法是借助一个蹦床函数的帮助,它的原理是接受一个函数作为参数,在蹦床函数内部执行函数,如果函数的返回是也是一个函数,就继续执行。

JavaScript 代码:
  1. function trampoline(f) {
  2. while (f && f instanceof Function) {
  3. f = f()
  4. }
  5. return f
  6. }

可以看到,这里也没有在函数内部调用函数,而是在循环中重复调用同一个函数,这也避免了增加调用栈长度,下面要做的是将原来的 Fibonacci 函数改写为每次返回另一个函数的版本:

JavaScript 代码:
  1. function fibonacciFunc(n, a = 0, b = 1) {
  2. if (n > 0) {
  3. [a, b] = [b, a + b]
  4. return fibonacciFunc.bind(null, n 1, a, b)
  5. } else {
  6. return a
  7. }
  8. }
  9.  
  10. trampoline(fibonacciFunc(5)) // return 5

这部分硬是没有看懂,感觉fibonacciFunc(5)应该就可以返回想要的值了,为什么我测试typeof fiboacci(5)函数的确是Function类型。

 

分享

发表评论