闭包的相关内容(帮助你快速理解,面试绝对稳稳的)

1.闭包是什么?

闭包就是外层函数的作用域对象,在外层函数被调用后,依然被内层函数引用着,无法释放,形成了这样一个结构,就叫闭包。

2.闭包的缺点:

占用内存————因为它会有一个外层函数的作用域对象没有释放,导致多占一个内存位置。

3.闭包的三步曲:

(1)先用一个外层函数包裹将要保护的变量和内层函数

(2)外层函数将内层函数返回到外部

(3)必须调用外层函数,用变量来接住返回出来的内层函数

4.闭包如何释放?

当一个闭包结构不再使用后,就需要手动释放!手动释放!手动释放!将内层函数的变量赋值为`null`即可释放,这样内层函数就被释放了,那么被内层函数引用着的外层函数的作用域对象也就释放了。比如:pay=null。

5.闭包实例:

问题:压岁钱有1000元,用一次少100,要统计剩下的钱。

(1)思路1:常规思路,虽然能实现,但是有漏洞,会被外部代码影响,导致函数变得毫无意义

var total = 1000;
function pay(){
    total -= 100;
    console.log(`还剩${total}`元);
}
pay(100);  //900
pay(100);  //800
//如果此时有外部程序恶意修改全局变量,那么这个函数将变得毫无意义
total = 0;
pay(100);  //-100

(2)思路2:将total定义成局部变量

function pay(){
    var total = 1000;
    total -= 100;
    console.log(`还剩${total}元`);
}
pay(100);  //900
//  当再次调用时就会发现错误,每调用一次pay(),那么局部变量的total都会重置为1000,不合实际。
pay(100);  //900

(3)思路3:使用闭包

①首先用一个外部函数将要保护的函数和内层函数包裹起来

function mother(){
    //这是原函数思路 --开始
    var total = 1000;
    function pay(){
        total -= 100;
        console.log(`还剩${total}元`)
    }
    //这是原函数思路 --结束
}

②然后外层函数需要将内层函数返回到外部

function mother(){
    var total = 1000;
    //此处就时将内部函数当做一个整体返回到外部函数中,使用匿名函数
    return function(money){
        total -= 100;
        console.log(`还剩${total}元`);
    }
}

③最后用一个变量来接收返回出来的内层函数

function mother(){
    var total = 1000;
    return function(money){
        total -= 100;
        console.log(`还剩${total}元`);   
    }
}
//此处就是用变量接收
var pay = mother();
//当执行到这儿的时候,内部函数也就是成了function pay(money){ ... }
//调用
pay(100); //900
pay(100); //800
//当再次进行恶意修改时
total = 0;
//因为此时total只会在跟mother()对象同级的全局对象中添加上这个total=0,然而在函数调用执行时,实际上是先找到自己作用域中的total,对于它母亲同级的total毫无关系,所以就不会造成污染了。
pay(100); //700
//从而完美实现了函数可以重用,但是不会被其他代码污染的效果。

写得不是很好,望采纳。

如果你觉得对你有帮助,点个赞吧。。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值