闭包的应用场景:咱们很容易想到说是要保留一个函数的外部变量,原本闭包产生的条件就是内部作用域的变量在某个函数外部被应用到。艰深的说,闭包能够使得函数产生记忆性能。
那再来看一个问题:递归求和。咱们实现一个Fibonacci数列看是怎么做的。
`var count=0
function fib(i){ count++ return i<2?i:fib(i-2)+fib(i-1) } for(var i=0;i<10;i++){ console.log(fib(i)) } console.log("count计算了多少次",count)`
count变量是为了看一下实现这个性能,fib()函数调用了几次。打印的后果:
咱们看到了进行了200屡次的计算,如果i<10000预计要产生栈溢出了!
那利用闭包能够优化一下性能吗?
当然能够!咱们能够利用闭包把之前计算过的数据保存起来,下次计算的时候看有没有这个数据,有就间接取值,没有再计算。
咱们接下来用闭包来批改一下这个函数实现
`<script type="text/javascript">
var count=0 var fibonacci=function (){ var originalArr=[0,1] var fib=function(i){ count++ var result=originalArr[i] if(typeof result!=='number'){ result=fib(i-1)+fib(i-2) originalArr[i]=result } return result } return fib }() for(var i=0;i<10;i++){ var computedResult=fibonacci(i) console.log(computedResult) } console.log("count计算了多少次",count) </script>`
咱们在来看一下打印后果:
26次!是不是缩小来很多调用次数呢,闭包在这里调用给咱们提供来很大的不便