JavaScript中的闭包

闭包是什么?

一个具有封闭的不对外公开的包裹或空间。

Js中的闭包与其原理

js中的闭包就是函数,原理就是函数的作用域访问原则,上级作用域无法访问下级作用域中的变量。

具体代码如下:
  function f1(){
            var num = 123;
            function f2(){
                console.log(num);
            }
            f2();
       }

该代码运行后,控制台并不会打印什么东西。因为f1无法访问下级作用域f2中的变量。

闭包存在的问题及解决方案。

1.闭包内的数据不允许外界访问

2.要解决的问题就是间接访问该数据

具体代码如下
  function foo () {
          var num = 123;
           return num;
       }

        var x = foo();
       console.log(x);

        var y = foo();
       console.log( x === y );

        //用来说明函数的每次调用,返回的对象都是新的  每次都不一样
        function foo(){
            var obj = {
               name:"金克丝",
               nickName:"暴走萝莉"
            }
           return obj;
        }
        var obj1 = foo();
        var obj2 = foo();
        console.log(obj1 == obj2);
使用return关键字将函数内部的数据返回,这个数据只能被使用一次。

闭包的基本原则

在外部函数(foo)内创建函数(inner),在这个内部函数(inner)中,可以操作foo中的数据
将外部函数的返回值设置为内部函数
使用这个内部函数,就可以在外部对外部函数里的变量进行修改。
上文说道,闭包的数据无法通过外界访问修改,如果利用return变量的方式,不能修改只能访问。
1.函数内部的函数中可以访问该函数中的变量
2.但是我们需要在函数外部去访问函数中变量
function foo(){
    var num = 100;
    return function(a){
       //1.如果传参数,这里的a肯定不是Undefined,所以条件判断为true
       if(a!==undefined){
          num = a;
       }
       else{
       //如果不传参,代表要获取这个值,直接return
       return num;
       }
    }

}

 var func =  foo();
        //设置值
        func(789);

        //理想状态下的获取值
        var x = func();
        console.log(x);
        func(987);
        console.log(func());

用闭包来修改多个数据

function foo{
   var name= "卡卡";
   var age = 26;
  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())
   }
}

闭包的作用

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

 function foo(){
            var name = "李金鱼";
            var badLevel = -1000000000000000000000000000000000;
            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 name = "";
        var age = 19;

        //张二狗
        name = "二狗";

        //隔壁老王
        name = "隔壁老王到此一游";
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值