JS进阶之闭包

问题引出

存在问题:局部变量无法共享和长久的保存,而全局变量可能造成变量污染
目的:当我们希望有一种机制既可以长久的保存变量又不会造成全局污染

存在问题

    //全局变量会造成变量空间的污染
    var a = 10;  
    function f1(){
        var b = 100;
    }
    
    //局部变量无法长久保存,每次执行函数都会重置a
    function f1(){
        var a = 10; 
        a++; 
        return a; 
    }
    f1();   //11 11 11 11 11
    //每一次执行f1()  都将重新创建变量a,并没有维持a的状态

改进方法1

    var a = 10; 
    function f1(){
        a++; 
        return a; 
    }
    f1(); //11 12 13 14

改进方法2

    function f1(){
    var a=10;
    function f2(){
            a++;
            console.log(a); 
    };
        return f2;
    };
    //另一种写法:
    //     function f1(){
    //     var a=10;
    //      return function(){
    //             a++;
    //             console.log(a); 
    //     };
    //   };

    f1()() //11 11 11 11
    var f = f1();  //相当于把f1执行的结果赋给了一个全局变量f,导致f2始终在内存中没有回收,f2依赖于f1,所以f1不会在调用后回收
    f(); //11 12 13 14

反例

    function f1(){
        var a = 10; 
        a++; 
        return a; 
    }
    var f11 = f1;
    f11(); //11 11 11 11 相当于重新执行f1

实际作用(实例)
对象封装 获取/修改name缓存

    function person(){
        var name = 'abc';
        return {
            getName:function(){
                return name;
            },
            setName:function(newName){
                name = newName
            }
        }
    };
    var person = person();
    //获取局部变量name
    person.getName(); //abc
    //改变局部变量name
    person.setName('xyz');
    person.getName(); //xyz

    //另一种写法 直接把函数赋给变量
    // var person = function(){
    //     var name = 'abc';
    //     return {
    //         getName:function(){
    //             return name;
    //         },
    //         setName:function(newName){
    //             name = newName
    //         }
    //     }
    // }();
    // person.getName(); //abc
    // //改变name
    // person.setName('xyz');
    // person.getName(); //xyz
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值