要理解闭包首先要知道什么是函数的作用域链
因为有函数的作用域链存在,所以函数无论在哪里调用,函数都可以使用函数外部作用域的变量。
当一个函数被调用时,会创建一个执行环境及相应的作用域链。然后使用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));