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
//从而完美实现了函数可以重用,但是不会被其他代码污染的效果。
写得不是很好,望采纳。
如果你觉得对你有帮助,点个赞吧。。