• 谈谈对闭包的理解


    说起闭包,让很多新手头疼的一个概念,甚至于有一两年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大牛道格拉斯提出的 */
  • 相关阅读:
    HDU 5059 Help him
    HDU 5058 So easy
    HDU 5056 Boring count
    HDU 5055 Bob and math problem
    HDU 5054 Alice and Bob
    HDU 5019 Revenge of GCD
    HDU 5018 Revenge of Fibonacci
    HDU 1556 Color the ball
    CodeForces 702D Road to Post Office
    CodeForces 702C Cellular Network
  • 原文地址:https://www.cnblogs.com/zwhbk/p/8663949.html
Copyright © 2020-2023  润新知