首页 > 代码库 > 3.使用闭包实现数据缓存

3.使用闭包实现数据缓存

闭包:

  闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。在PHP、Scala、Scheme、Common Lisp、Smalltalk、Groovy、JavaScript、Ruby、 Python、Go、Lua、objective c、swift 以及Java(Java8及以上)等语言中都能找到对闭包不同程度的支持。

 说了一大堆废话,唉,那么简单来说,闭包就是函数以及函数所处的环境的一个集合体;闭包是一个受保护的空间

今天,主要来简单介绍闭包的一个作用:数据缓存

  我们知道当今的社会是信息化的社会,每时每刻都会产生数以万计的数据,我们需要通过一定的手段对数据进行分析和处理,那么处理速度就尤其的重要了,在我们javascript中,可以利用闭包实现数据的缓存。提高用户的访问流畅性。

通过处理斐波那契数列Fibonacci sequence),我们可以很明显的体会到数据缓存的优势。

 

 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4     <meta charset="UTF-8"> 5     <title>Document</title> 6 </head> 7 <body> 8     <script type="text/javascript"> 9     //声明一个全局变量用来保存计算次数10     var count = 0;11         function fun(num){12             count++;13             //临界条件14             if(num == 0 || num == 1){15                 return 1;16             }17             return fun(num-1)+fun(num-2);18         }19         fun(20);20         console.log(count);21     </script>22     <script>23         var count = 0;24         var fun = (function(){25             var cache = [];26             return function(num){27                 count++;28                 //临界值29                 if(num == 0 || num == 1){30                     cache[num] = 1;31                     return 1;32                 }33                 //如果缓存数据中存在,直接调用34                 if(cache[num]){35                     return cache[num];36                 }37                 //不存在直接计算38                 else{39                     cache[num] = fun(num-1)+fun(num-2);40                     return cache[num];41                 }42             };43         })();44         fun(20);45         console.log(count);46     </script>47 </body>48 </html>

 

计算结果表明,没有数据缓存的结果是:21891,而利用数据缓存的结果是:39。

 

3.使用闭包实现数据缓存