# 闭包

每个函数都有自己作用域链,如果你在函数内部定义了变量,之后这个函数又返回了一个新的函数并且引用了之前定义的变量。这个时候之前定义的变量则成了私有变量而且还不会被销毁。

这就是闭包的典型例子。因为他可以将函数内部的变量通过作用域链把函数关联起来。

var scope = 'global scope'

function checkScope() {
    var scope = 'local scope';
    var f = function() {
        return scope;
    }
    return f
}

var fn = checkScope();
fn() // local scope

随着 checkScope 函数的执行完毕,但 checkScope 内部定义的 scope 变量并没有被回收。因为还有函数在引用这 scope 变量。而 scope 只能被 fn 函数所调用。这样的特性可以实现很多有趣的应用。比如 redux 中的 store 就是这样被创建出来的。

# 闭包和面向对象设计

我们可以通过闭包来实现私有变量,来看看下面这段代码

var Obj = function() {
    var val = 0;
    return {
        name: '石兴龙',
        call: function() {
            val++;
            console.log(val);
        }
    }
}
var o = Obj();
o.call()  // 1
o.call()  // 2
o.call()  // 3
o.name    // 石兴龙
o.val     // undefined

上面的代码中,val 是私有变量,外面是无法直接访问到的

上次更新: 8/5/2020, 12:21:17 AM