要理解闭包首先要知道什么是函数的作用域链

因为有函数的作用域链存在,所以函数无论在哪里调用,函数都可以使用函数外部作用域的变量。

当一个函数被调用时,会创建一个执行环境及相应的作用域链。然后使用arguments和其他命名参数的值来初始化函数的活动对象。此活动对象在当前函数作用域链的第一位,外部函数的活动对象在作用域链的第二位,外部函数的外部函数的活动对象在第三位,直至作为作用域链终点的全局执行环境。

 

闭包的作用:

实现一个作用域,达到封装的目的,这样做的好处是隐藏私有变量,防止污染全局变量;

还可以实现缓存功能

 

1        案例1:隐藏私有变量
 2 
 3         function pack() {
 4 
 5             var index;
 6 
 7             return function () {
 8 
 9                 return index++;
10 
11             };
12 
13         }
14 
15 
16 
17         var p = pack();
18 
19         p();
20 
21 
22 
23         案例2:缓存
24 
25         function createFab(n) {
26             var _cache = {};
27             return function (n) {
28                 var result = 0;
29                 if (_cache[n]) {
30                     return _cache[n];
31                 }
32                 if (n === 1 || n === 2) {
33                     result = 1;
34                 }
35                 else {
36                     result = fab(n - 1) + fab(n - 2);
37                 }
38                 _cache[n] = result;
39                 return result;
40             }
41         }
42 
43 
44         var fab = createFab();
45         console.info(fab(6));
46         console.info(fab(6));