Closures (闭包) - Part 4 of 函数式编程


  • administrators

    闭包是函数和声明该函数的词法环境的组合。

    上面这段摘自Moz://a ,读起来有点拗口。通俗点说闭包是一种函数声称,它的特别之处是一个函数被包裹在其他函数(function)或者对象(object)里。

    Javascript的词法环境(lexical environment )有点特殊:函数内部的变量(⚠️这里指加了var, let, 或者const,不然就变全局变量了)不可以被外部访问,但是可以在内部函数(即闭包)里被访问。这么一来,如果我们把闭包函数返回,赋给外部变量,这样外部不就可以访问函数内部的变量了吗?(大哥,有点聪明啊 😄

    来个例子看看:

    function outterFun() {
      var name = "localVar";
      return function innerFun() {
        return name;
      };
    }
    var magicFun = outterFun();
    console.log(name); //不能访问
    console.log(magicFun()); // 用闭包就可以了
    

    闭包基本实现了,面向对象语言里的private变量的功能,也就是说你可以把闭包看成是其父函数的public函数,父函数的变量只可以用public函数来改变。
    再来个例子:

    var counter = (function() {
      var privateCounter = 0;
      function changeBy(val) {
        privateCounter += val;
      }
      return {
        increment: function() {
          changeBy(1);
        },
        decrement: function() {
          changeBy(-1);
        },
        value: function() {
          return privateCounter;
        }
      };   
    })();
    
    console.log(counter.value()); // logs 0
    counter.increment();
    counter.increment();
    console.log(counter.value()); // logs 2
    counter.decrement();
    console.log(counter.value()); // logs 1