zoukankan      html  css  js  c++  java
  • 谈谈对闭包的理解

    说起闭包,让很多新手头疼的一个概念,甚至于有一两年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大牛道格拉斯提出的 */
  • 相关阅读:
    [原] KVM 虚拟化原理探究(6)— 块设备IO虚拟化
    [原] KVM 虚拟化原理探究(5)— 网络IO虚拟化
    [原] KVM 虚拟化原理探究(4)— 内存虚拟化
    [原] KVM 虚拟化原理探究(3)— CPU 虚拟化
    [原] KVM 虚拟化原理探究(2)— QEMU启动过程
    [原] KVM虚拟机网络闪断分析
    [原] KVM 环境下MySQL性能对比
    [源]云计算技术堆栈系列——鸟瞰
    [原] 利用 OVS 建立 VxLAN 虚拟网络实验
    [原] Cgroup CPU, Blkio 测试
  • 原文地址:https://www.cnblogs.com/zwhbk/p/8663949.html
Copyright © 2011-2022 走看看