闭包,什么是闭包,闭包题目及解析
闭包
谈闭包前我们先来了解一下函数
-
.函数定义阶段
i.在内存中开辟一个存储空间
ii.把函数体内的代码当做字符串一模一样的的放在这个空间中
1.碰到的所有变量都不进行解析
iii.把这个空间地址赋值给函数名(变量名) -
函数调用阶段
i.按照函数名(变量名)找到对应的存储空间
ii.重新开辟一个函数执行空间
iii.在这个执行空间里面进行形参赋值
iv.在这个执行空间里面进行预解析
v.把函数存储空间的代码复制一份到执行空间里面执行一遍
vi.执行完毕以后,这个开辟出来的执行空间销毁 -
函数的调用
i.每一次函数调用都会开辟一个执行空间
ii.你调用一次,开辟一个执行空间
iii.执行完毕代码销毁
iv.你再次调用的时候,再次开辟一个执行空间
v.执行完毕代码销毁
在来谈谈什么情况下函数的执行空间不会被销毁
-
一个不会销毁的函数执行空间
i.一个函数在执行的时候,会开辟一个执行空间
ii.所有代码在这个执行空间里面执行
iii.执行完毕以后,这个函数执行空间销毁 -
在一个特殊的情况下
i.函数的执行空间是不会被销毁的 -
什么是特殊的情况
i.当函数内部返回一个“复杂数据类型”
ii.并且在函数外部有变量接收一个“复杂数据类型”的时候
iii.这个时候函数的执行空间不会被销毁 -
这个不会销毁的函数执行空间
i.什么时候会销毁
ii.当外部接收的这个变量不再引用函数内部的返回值的时候
iii.这个函数执行空间就销毁了
闭包
-
闭包的生成有三个必要条件(缺一不可)
1.在函数A内部直接或者间接返回一个函数B
2.B函数内部使用着A函数的私有变量(私有数据)
3.A函数外部有一个变量接收这个函数B
这样就形成了一个不会销毁的函数空间 -
闭包空间
1.我们管这个不会被销毁的A函数的执行空间叫做闭包空间
2.把函数A里面返回的函数B,叫做函数A的闭包函数
3.官方给的定义后一句话:闭包==>函数内部的函数 -
闭包的特点(优点和缺点并行)
1.延长了变量的生命周期
优点:因为执行空间不销毁,变量也就没有销毁
缺点:因为执行空间不销毁,会一直存在内存中
2.可以访问函数内部的私有变量
优点:利用闭包函数可以访问函数内部的私有变量
缺点:执行空间不会销毁,会一直存在内存中
3.保护私有变量(只要是函数就有这个特点)
优点:保护私有变量不被外界访问
缺点:如果想访问,必须要利用闭包函数 -
闭包函数的缺点"致命"
1.因为当一段内存空间中有一个不会被销毁的东西一直存在
2.那么就会出现内存占用,如果过多,就会导致内存溢出
3.那么结果就是内存泄露 -
啥时候用闭包好
1.就是当你需要延长变量的生命周期的时候
2.或者你需要访问某一个函数内部的私有变量的时候
闭包的小题目
function fn(i){
return function(n){
console.log(n + (--i))
}
}
var f = fn(2)
f(3)
fn(4)(5)
fn(6)(7)
f(8)
解析:这里我按照画图的方式来解析这样比较直观更容易理解:
function fn(i){
return function(n){
console.log(n + (i++))
}
}
var f = fn(10)
f(20)
fn(20)(40)
fn(30)(50)
f(30)