JS闭包

77 阅读1分钟

视频讲解闭包

定义:当一个内部函数被其外部函数之外的变量引用时,就形成了一个闭包。 何时使用: 如果希望重用一个变量,且不希望该变量被随意篡改时。

 如何实现:3步:
 1. 用外层函数将受保护的变量和操作变量的函数封装在内部
 2. 外层函数将内层函数对象返回(返回的是函数对象地址:0x9091……)
 3. 调用外层函数,获得返回的内层函数对象。

 实际运用中:
 1. 先找到受保护的变量,确定其值(特殊: 变量的值很可能不是声明时的初始值——看外层函数调用结束时,n的值)
 2. 找到操作变量的函数,确定外层函数向外部返回了几个内层函数对象,所有内层函数对象,公用同一个变量。
 3. 两次外层函数调用,返回的不同内层函数对象,所操作的变量,没有任何关系。

代码

 //Step1: 外层函数包裹受保护的变量和操作变量的内层函数
    function outer(){
        var n=1;//重用,被保护
        //Step2: 外层函数将内层函数返回
        return function(){ return n++; }
    }
    //Step3: 调用外层函数,获得内层函数对象
    //就得到了闭包结构。
    var getNum=outer();
    var getDecimal=outer();
    //getNum: function(){ return n++; }
    //getDecimal: function(){ return n++; }

    console.log(getNum());//1
    console.log(getNum());//2
    n=1;
    console.log(getNum());//3
    console.log(getNum());//4

console.info("----------------------")

    console.log(getDecimal());//1
    console.log(getDecimal());//2
    n=1;
    console.log(getDecimal());//3
    console.log(getDecimal());//4


console.info("----------------------")

    var iBaseNum = 10;
    function addNum(iNum1, iNum2) {
        function doAdd() {
            return iNum1 + iNum2 + iBaseNum;
        }
        return doAdd();
    }
    console.log(addNum(1,1));//12

具体示例