谈谈对闭包的理解

时间:2021-08-31 22:43:42

说起闭包,让很多新手头疼的一个概念,甚至于有一两年js基础的开发人员也没有搞懂

说到闭包,要从js的作用域说起,js的变量是函数作用域,且变量不能被函数外部访问,但是可以被函数内部的函数访问.这称为js链式作用域

1什么是闭包???(我的理解是,闭包就是能够读取其他函数内部变量的函数)

        function t1(){
            var age = 20;
            function t2(){
                alert(age);
            };
            return t2;
        };

        var tnp = t1();

        /*
            1、在大部分的语言中,t1被调用执行,申请内存,并把局部变量push入栈,
            t1函数执行完毕后,内部的局部变量随着函数的退出而销毁,因此age = 20的局部变量也就释放了。

            2、但是在js中,t1执行过程中,又生成了t2,而从作用于上来说t2可以访
            问到age = 20,于是age = 20并没有消失,而是与返回的t1函数形成了一个环境包,这个包属于t2,也即是闭包。

            一句话概括就是:函数的作用域取决于声明时而不是取决于调用时
        */

        var age = 100;
        tnp();//20

2函数的作用域取决于声明时而不是取决于调用时

        function closure(){
            var sister = '大桃花';
            var me = function(){
                alert(sister);
            };
            return me;
        };

        function place(){
            var sister = '大福晋';
            var girl = closure();
            girl();
        };

        place();//大桃花

3闭包的作用(防止全局污染,它使得函数拥有私有变量变成可能,使得让这些变量的值始终保持在内存中) 

计数器受匿名函数的作用域保护,只能通过 add 方法修改

var add = (function () {
    var counter = 0;
    return function () {return counter += 1;}
})();

4用闭包来完成私有属性

// 用闭包让bf不能外界访问
        function Girl(name,bf){
            var secret = bf;
            this.name = name;
            // 通过showlove做借口来读取私有属性secret
            this.showlove = function(){
                return secret;
            };

            // 外界是操作不了变化的
            this.movelove = function(){
                secret = '薛宝钗';
            };    
        };
        var daiyu = new Girl('林黛玉','贾宝玉');
        alert(daiyu.name+'喜欢'+daiyu.bf);//林黛玉喜欢undefined
        daiyu.movelove();
        alert(daiyu.name+'喜欢'+daiyu.showlove());//林黛玉喜欢薛宝钗
/* 这是通过闭包来完成js面向对象的私有属性与封装 这方法是js大牛道格拉斯提出的 */