闭包

执行环境

在javscript中执行环境主要分为两种

  • 全局执行环境:NodeJs中为global,所有的全景属性和方法全都挂在gloabl上,可以在任意地方访问,其生命周期直至程序退出时销毁。
  • 函数执行环境:当执行一个函数时,v8引擎进入函数执行环境,函数代码执行完毕则销毁。

所有的执行环境以栈的形式管理,底部是全局执行环境,顶部是当前函数执行环境。

function outer() {
    function inner() {

    };
    inner();
}
outer();

执行outer函数时执行环境栈为:(顶部)inner函数执行环境-outer函数执行环境-global全局执行环境(底部)

每一个执行环境都对应一个变量对象,保存着形参var定义的变量函数声明

作用域链

作用域链是当前执行环境所关联变量对象列表,在函数定义时创建,当查找变量时,从自身变量对象一直向父环境变量对象查找(就近原则)

//test.js
color = 'yellow';
var color = "blue";
function getColor() {
    var color = "red";
    return color;
}
console.log(getColor());

这里存在三个执行环境,因此关联三个变量对象,1是函数getColor之内,1是getColor之外test.sj文件之内,3是全局global,查找变量时依次从1-2-3顺序查找,找到即停。
** ps:一般js中的全局变量直接挂载在global上,nodejs把js文件封装进了函数 **

闭包

闭包是一个可以访问其他函数内部变量的函数。

  • 闭包可以用来访问函数内部变量
  • 闭包缓存变量于内存

闭包实现获取函数调用次数

function compute() {
    var _object = {};
    function finalCompute() {
        var key = finalCompute.caller.toString().match(/function\s*([^(]*)\(/)[1] || '匿名函数';
        if (!_object[key])
            _object[key] = 0;

        _object[key] += 1;
        console.log(`第${_object[key]}次调用function ${key}`);
    }

    return {'finalCompute': finalCompute, '_object': _object};
}
const com      = compute();

闭包实现累加

function add() {
    var _total = 0;
    return function (para) {
        _total += para;
        return _total;
    }
}
var ADD = add();

闭包实现缓存

const co = function () {
    let cache = null;
    return function (a, b) {
        if (!cache) {
            cache = a * b;
            console.log('超时计算');
        }
        return cache;
    }
};

const user = co();
console.log(user(3, 4));
console.log(user(5, 6));

你可能感兴趣的:(闭包)