JavaScript闭包浅谈

作者: 费莱姆 | 来源:发表于2018-12-30 09:25 被阅读3次

    一.闭包

    1、什么是闭包

    闭:闭合,关闭,封闭。
    包:包裹,包起来。
    一个具有封闭的对外不公开的, 包裹结构, 或空间。

    2.js中的闭包:就是函数。

    3.闭包的原理就是作用域访问原则

    上级作用域无法直接访问下级作用域中的变量。

    function f1(){
               var num = 123;
               function f2(){
                   console.log(num);
               }
               f2();  //123
           }
           f1(); //无法访问
    

    4.闭包要解决什么问题?

    a.闭包内的数据不允许外界访问。
    b.要解决的问题就是间接访问该数据。

    //函数的每次调用,返回的对象都是新的  每次都不一样
    function foo () {
               var num = 123;
               return num;
           }
    
           var x = foo();
           console.log(x); //123
    
           var y = foo();
           console.log( x === y ); //undeifnd
    
    //使用return关键字将函数内部的数据返回,这个数据只能被使用一次
     function foo(){
                var num = 123;
                 return num;
           }
            var x = foo();
    

    5.闭包基本模式

    在外部函数(foo)内创建函数(inner),在这个内部函数(inner)中,可以操作foo中的数据
    将外部函数的返回值设置为内部函数
    在外部调用外部函数(foo),就可以接受到返回值(内部函数)
    使用这个内部函数,就可以在外部对外部函数里的变量进行修改

    二.

    1.使用闭包获取多个数据

    function foo() {
                var name = "张国荣";
                var age = 18;
    
                return {
                    getName:function () {
                        return name;
                    },
                    getAge:function () {
                        return age;
                    }
                }
            }
    
            var obj = foo();
            console.log(obj.getName());
            console.log(obj.getAge());
    

    2.使用对象返回多个方法,来获取并设置值

    function foo() {
                var name = "高金彪";
                var gender = "female";
    
                return {
    
                    getName:function () {
                        return name;
                    },
                    setName:function(value){
                        name = value;
                        return name;
                    },
                    setGender:function(value){
                        gender = value;
    //                    return gender;
                    },
                    getGender:function(){
                        return gender;
                    }
    
                };
            }
    
            var obj = foo();
            console.log(obj.getGender());
    
            console.log(obj.setGender("雄"));
    //        console.log(obj.getGender());
    

    3.闭包的作用

    最基本的作用:可以通过闭包返回的函数或者方法,来修改函数内部的数据
    创建一个私有的空间,保护数据
    外部想要访问数据,只能通过函数提供的方法
    在提供的方法中,我们可以设置一些校验逻辑,让数据变得更加安全

     function foo(){
                var name = "小明";
                var badLevel = -10;
                return {
                    getName: function () {
                        return name;
                    },
                    setName: function (value) {
                        name = value;
                        return name;
                    },
                    getBadLevel:function(){
                        return badLevel;
                    },
                    setBadLevel:function (value) {
                        //在函数外部想要修改数据
                        //只能通过函数内部的方法
                        //我们可以在函数内部定义的这个方法里
                        //设置安全措施,校验之类的操作
                        //可以保证系统的安全性和稳定性
                        if(value > 0 ){
                            throw "你敢说我坏!!!";
                        }
    
                        badLevel = value;
                        return badLevel;
                    }
                }
            }
    
    //
    
            var obj = foo();
    //        obj.setName("金彪");
            obj.setBadLevel(obj.getBadLevel() * -1 * Math.pow(10,1));
            console.log(obj.getBadLevel());
    

    相关文章

      网友评论

        本文标题:JavaScript闭包浅谈

        本文链接:https://www.haomeiwen.com/subject/fbcjlqtx.html