闭包
闭包就是能够读取其他函数内部变量的函数;
由于在JavaScript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解为“定义在一个函数内部的函数”,所以在本质上闭包就是把函数内部和外部连接起来的一座桥梁;
闭包的用途
闭包有很多用途,最大的用途有两个,一是读取其他函数内部的变量,二是把这些变量的值始终保存在内存中,例如:朋友圈点赞和计时器
优点:可重用变量,不会造成全局污染
缺点:过多使用闭包,会造成内存泄漏
简单的闭包
<script>
//闭包3步:
//1. 用外层函数包裹要保护的变量和内层函数
function parent(){
var total=1000;//总零花钱数
//2. 外层函数将内层函数返回到外部,让别人可以使用。
return function(money){
total-=money;
console.log(`花了${money}元,还剩${total}元`)
}
}
//3. 调用外层函数获得返回的内部函数对象
var pay=parent();
//pay:function(money){...}
pay(100);//900;
total=0;//试图篡改total
pay(100);//800;
total=0;//试图篡改total
pay(100);//700;
total=0;//试图篡改total
pay(100);//600;
pay(100);//500;
</script>
function fun(){
var n=999;
//在任何位置给未声明过的变量强行赋值,js会在全局自动创建该变量。——广受诟病的缺陷
nAdd=function(){ n++ };
return function(){
console.log(n)
}
}
var getN=fun()
//getN=function(){ console.log(n) }
getN();//999
nAdd();//1000
getN();//999
var getN2=fun();
getN2(); //999
闭包到底是什么?闭包其实就是受内层函数引用着无法释放的外层函数的作用域对象(图中红框对象才是闭包对象的真身)
闭包形成的原因: 内层函数的好友列表引用着外层函数的作用域对象,导致其无法释放。
<script>
function fun(){ //妈妈
for(var i=0;i<3;i++){ //循环执行3次
arr[i]=function(){console.log(i)} //创建了一个孩子没有调用
}
// return前 i=3 ,并且i=3时才能退出循环
return arr;
}
var funs=fun(); //妈妈调用了一次
funs[0](); //3
funs[1](); //3
funs[2](); //3
</script>
来源:CSDN
作者:Ellison_d
链接:https://blog.csdn.net/Ellison_d/article/details/104008666