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