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