闭包:
闭包是指可以包含自由(未绑定到特定对象)变量的代码块;这些变量不是在这个代码块内或者任何全局上下文中定义的,而是在定义代码块的环境中定义(局部变量)。“闭包” 一词来源于以下两者的结合:要执行的代码块(由于自由变量被包含在代码块中,这些自由变量以及它们引用的对象没有被释放)和为自由变量提供绑定的计算环境(作用域)。在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。