最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • 深入理解闭包(closure)

    正文概述 掘金(山竹回家了)   2020-12-06   527

    0.什么是闭包

    1.闭包的特点

    2.解决闭包的麻烦

    3.demo

    <body>
        <button>自增</button>
        <h1></h1>
        <script>
            const btn = document.querySelector('button');
            const h1 = document.querySelector('h1');
    
            // 闭包的特点:外部函数结束,内部函数依然存在,而且占用了外部函数的变量
            //(导致外部函数不能释放内存)
    
            function setElement() {
                // 1. 定义一个数组
                let arr = [
                    { name: "金" },
                    { name: "木" },
                    { name: "水" },
                    { name: "火" },
                    { name: "土" }
                ];
    
                // 2. 定义一个下标
                let index = -1;         // 不是数组真正有效的下标
    
                // 3. 返回一个函数
                return function () {
                    // 3.1  修改index
                    index++;            // 当前函数没有index,访问的是外部的index
    
                    // 3.2 判定
                    if (index > arr.length - 1) {
                        index = 0;     //这时显示下标0,"金"
                    }
    
                    // 3.3 返回当前的数据
                    return arr[index].name;
                };
            }
    
            // 调用函数setElement
            let getElement = setElement();
    
            // 代码执行到这:函数setElement()执行已经结束
            // 按理说:应该释放setElement的内存(index,arr)
            // 但是:因为当前函数的运行返回了一个函数:里面要用到index和arr:导致函数不能
            //释放内存(内存一直被占用): 闭包
            // console.log(getElement);
    
            h1.innerText = getElement();//渲染
    
            // 点击事件
            // 点击调用函数,下标++显示不同数据
            btn.onclick = function () {
                h1.innerText = getElement();
            };
    
    
            // 假设后续还有很多代码要运行:上述内存一直会占用(虽然代码很安全,不存在污染的问题)
            // 解决闭包的麻烦:主动释放闭包所占用的内存
    
    
            // 释放内存把下面这行代码注释打开
            // getElement = null;          
            // getElement不再指向闭包函数function,闭包函数也就不需要占用变量arr和index:setElement函数可以得到释放
    
        </script>
    </body>
    

    4.this对象

    window.identity = '这是window'
            let obj = {
                identity: '这是obj',
                getIdentity() {
                    // 返回内部函数
                    return function () {
                        return this.identity
                    }
                }
            }
            console.log(obj.getIdentity()());//这是window
            // 注意最后还有()
    
     <script>
            window.identity = '这是window'
            let obj = {
                identity: '这是obj',
                getIdentity() {
                    let that = this
                    // 返回内部函数
                    return function () {
                        return that.identity
                    }
                }
            }
            console.log(obj.getIdentity()());//这是obj
            // 注意最后还有()
        </script>
    

    起源地下载网 » 深入理解闭包(closure)

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元