大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
理解:什么是闭包?
1.密闭的容器,类似set/map容器,用来存储数据
2.闭包是一个对象,存放数据的格式:key:value
闭包形成的条件
1.函数嵌套
2.内部函数引用外部函数
function fun(){
var count = 1;
function fun2(){//条件1:函数嵌套
//形成条件2:内部函数引用外部函数
console.log(count);
}
}
fun();
已经形成了闭包,以键值对的形式保存数据
在外部函数里面去调用fun2()
function fun(){
var count = 1;
function fun2(){//条件1:函数嵌套
//形成条件2:内部函数引用外部函数
console.log(count);
}
fun2();
}
fun();
fun2()执行之前断点,存在闭包
fun2()执行之后断点,闭包不在了,因为fun2()执行完成后,作用域销毁,释放内存,里面的闭包同时被销毁
闭包的应用场景:
将内部的函数返到外部去
function fun(){
var count = 1;
return function (){
console.log(count);
}
}
var fun2 = fun();
fun2();
fun2();
闭包的优点:
延长外部函数局部变量的生命周期
闭包的缺点:
优点也是缺点,本应被销毁的变量,因为闭包的原因没有被销毁,长期存在的话,容易造成内存泄漏
注意点:
1.合理使用闭包
2.用完闭包要及时清除(销毁),避免内存泄露
基本面试题:
function fun(){
var count = 1;
return function (){
count ++
console.log(count);
}
}
var fun2 = fun();
fun2();
fun2();
fun2()分别输出什么?
2/3
分析:
第一次执行return匿名函数执行count++ ,输出count = 2
第二次执行闭包起作用,第一次为被销毁
经典面试例题:
function fun(n,o){
console.log(o);
return{
fun:function(m){
return fun(m,n)
}
}
}
var a = fun(0)
a.fun(1)
a.fun(2)
a.fun(3)
var b = fun(0).fun(1).fun(2).fun(3)
var c = fun(0).fun(1)
c.fun(2)
c.fun(3)
函数内部有函数就已经满足了闭包的条件。
fun(0)
输出o为undefined:fun(0)只传一个参数赋值给n,o输出为undefined {n = 0}
a部分:
a.fun(1):a.fun代表内部函数的fun,执行内部函数,m = 1=>n,n=>o从内部向外部执行,n获取上次闭包值为0对应o,输出 o = 0 {m = 1}
a是返回对象 fun:function(m){ return fun(m,n) },闭包保存在a 中,闭包又是用来存储介质对的,认为key是n,存储的值是0,也就是说a 里面有一个闭包n值为0,所以每次传值不论传什么值进去,都是复制给m了,但通过闭包n值始终不变,n=0恒成立,所以:
var a = fun(0)
a.fun(1)
a.fun(2)
a.fun(3)
输出为:undefined,0,0,0
b部分:
var b = fun(0).fun(1).fun(2).fun(3)
由上述推导知:fun(0) = undefined
fun(0).fun(1)相当与a.fun(1),结果为0,返回值是个对象,n = 0
fun(0).fun(1).fun(2),返回值是个新的对象,内部存储的闭包也是新的,和上面不同,n = 1
fun(0).fun(1).fun(2).fun(3),n = 2
总结:
当前传入的参数为多少并不重要,重要的是上一步给闭包中传入的key为多少
例如:
var x = fun(0).fun(1).fun(2).fun(3).fun(12).fun(33).fun(78)
输出依次为:undefined/0/1//2/3/12/33
c部分:
var c = fun(0).fun(1)
c.fun(2)
c.fun(3)
输出依次:undefined/0/1/1
前端面试官问闭包,怎样回答脱颖而出_不爱吃糖的程序媛的博客-CSDN博客_前端面试闭包该怎么回答
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/178795.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...