闭包是什么?它的使用场景有哪些?

1.什么是闭包?

闭包,在函数外部可以使用函数内部的变量。

闭包的认识

function fn1() {
    let str = '函数外引用';
    // 将函数当做参数返回,被返回的函数内引用了 fn1 的变量 str
    // 此时str就不能被销毁
    return function () {
    console.log(str);
   }
}
   let cb = fn1();
   console.log(cb);
   cb();

2.闭包的使用场景有哪些?

场景1.柯理化

含义:柯理化(颗粒化) 将多个参数的函数,慢慢变的只剩一个参数.

例:正则对目标字符串进行验证

①正常写

function check(reg,str){
        return reg.test(str)
    }
    // 验证密码
    var res1 = check(/^\w{6,18}$/,'abcg123');
    var res2 = check(/^\w{6,18}$/,'11223');
    console.log(res1,res2);

②使用颗粒化减少参数的传递:

  function check(reg){// 形参也是局部变量
  // 作为返回值的函数中使用 局部变量reg,此时函数执行结束reg也不会被销毁
        return function(str){
            return reg.test(str);
        }
    }
    // 传递正则表达式给check,会被形参接受
    let pwdReg = check(/^\w{6,18}$/);
    let res11 = pwdReg('1234gt');
    let res22 = pwdReg('1234g');
    console.log(res11,res22);

场景2.防抖

含义:防抖,一个事件开始执行还没有结束,在指定时间又触发事件,则重新开始计时。

           一直被触发,则一直重新计时。

<input type="text" value="">
let input = document.querySelector('input');
        let times = '';
        input.oninput = function () {
            // 如果有延时器的返回值,则清空
            if (times) {
                clearTimeout(times);
            }
            // 锁定this指向
            let that = this;
            // 重新开始延时器
            times = setTimeout(function () {
                console.log(that);
                console.log(that.value);
            }, 1000);
        }

场景3.节流

含义:节流,在指定时间内,不管事件被触发几次,只会执行一次。

<input type="text" value=" ">
 let input = document.querySelector('input');
        // 节流,在指定时间内,不管事件被触发几次,只会执行一次
        let lock = false; // 锁
        input.oninput = function(){
        // 判断锁的状态,决定是否继续,如果为true则结束代码执行
        if(lock) return;
        lock = true;
        console.log(this.value);
        // 开启延时器,设置锁的状态
        setTimeout(function(){
            lock = false;
        },2000)
    }

总结

1 闭包的变量不等被及时释放,一直存在,就占用空间,造成内存泄漏。

2 可以形成私有变量,只能被特定的函数使用,避免变量污染。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值