js闭包理解与使用场景

时间:2021-09-05 23:51:54

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

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

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

闭包的作用:

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

还可以实现缓存功能

        案例1:隐藏私有变量

         function pack() {

             var index;

             return function () {

                 return index++;

             };

         }

         var p = pack();

         p();

         案例2:缓存

         function createFab(n) {
var _cache = {};
return function (n) {
var result = 0;
if (_cache[n]) {
return _cache[n];
}
if (n === 1 || n === 2) {
result = 1;
}
else {
result = fab(n - 1) + fab(n - 2);
}
_cache[n] = result;
return result;
}
} var fab = createFab();
console.info(fab(6));
console.info(fab(6));