闭包的使用场景:我们很容易想到说是要保存一个函数的内部变量,本来闭包产生的条件就是外部作用域的变量在某个函数内部被使用到。通俗的说,闭包可以使得函数产生记忆功能。

那再来看一个问题:递归求和。我们实现一个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()函数调用了几次。打印的结果:image.png
我们看到了进行了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>`
  

我们在来看一下打印结果:
image.png
26次!是不是减少来很多调用次数呢,闭包在这里调用给我们提供来很大的方便


李静
23 声望0 粉丝

我曾七次鄙视自己的灵魂: