美文网首页我爱编程
Javascript 学习(闭包)

Javascript 学习(闭包)

作者: Cats_eat_fish | 来源:发表于2018-04-13 14:13 被阅读0次

    js闭包

    js中的闭包问题是由函数变量的作用域引出的,全局变量和局部变量的概念和Java感觉没有太大的区别,但是如果要在js中实现Java中的私有变量效果,就引出了js闭包。

    全局变量

    在js中全局变量是指在function外部声明的变量,或者在function内部没有通过var声明的变量;
    全局变量的生命周期是全局性的,即:在整个js文件中都可以调用。

    例如:
    var a = 0;//全局变量
    function myfunction(){
        b = 0;//全局变量
        //这里可以访问a;
        return a + b;
    }
    

    局部变量

    在js中局部变量是指在function内部通过var生命的变量;
    局部变量的生命周期是局部性的,也就是只有在其声明的function中才可以调用。

    例如:
    var a = 0;//全局变量
    function myfunction(){
        var b = 0;//局部变量
        //这里可以访问a
        return a + b;
    }
    //但是在myfunction()外部不能访问b
    

    私有化需求

    现在好多地方都会有计数器的需求;
    通常我们可以通过定义全局变量的方式来实现;

    例如:
    var count = 0;
    funtion add(){
        retutn ++count;
    }
    

    这样看着是实现了我们想要的功能,但是这样的话count变量是一个全局变量,所有的function都可以访问这个变量,不安全;
    但是局部变量又不能满足我们的需求;

    例如:
    function add(){
        var count = 0;
        return ++count;
    }
    

    这样每次的返回结果都是1,不是我们想要的;
    在js中每个function都可以访问他上一层声明的变量,

    例如:
    function func1(){
        var a = 0;
        var b = function (){
            //这里可以访问变量a
            return a++;
        }
        //这里调用b() 变量a会增加1;
        b();
    }
    

    这样把上边的方法简单修改就可以了

    例如:
    var b = (function (){//function A
        var count = 0;
        return function(){//function B
            return ++count;
        }
    })();
    //每次调用b()count就会增加1后返回
    var c = b();
    

    这样最后变的()意思为调用了functionA,即:b依赖的不是functionA 而是functionA的返回值function B,
    在需要的地方直接调用b()就可以了
    这样count就变成了只有b()能访问到的私有变量了,这就是js中的闭包。

    相关文章

      网友评论

        本文标题:Javascript 学习(闭包)

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