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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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.使用闭包实现数据缓存的主要内容,如果未能解决你的问题,请参考以下文章

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

如何缓存片段视图

Android主流视频播放及缓存实现原理调研

关于闭包

Spark闭包与序列化

Rails:旧数据与新数据不匹配时如何更新片段缓存