前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >闭包常见面试题_闭包的特点

闭包常见面试题_闭包的特点

作者头像
全栈程序员站长
发布2022-09-27 10:46:11
6820
发布2022-09-27 10:46:11
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

理解:什么是闭包?

1.密闭的容器,类似set/map容器,用来存储数据

2.闭包是一个对象,存放数据的格式:key:value

闭包形成的条件

1.函数嵌套

2.内部函数引用外部函数

代码语言:javascript
复制
function fun(){
    var count = 1;
    function fun2(){//条件1:函数嵌套
    //形成条件2:内部函数引用外部函数
    console.log(count);
    }
}
fun();

已经形成了闭包,以键值对的形式保存数据

闭包常见面试题_闭包的特点
闭包常见面试题_闭包的特点

在外部函数里面去调用fun2()

代码语言:javascript
复制
function fun(){
    var count = 1;
    function fun2(){//条件1:函数嵌套
    //形成条件2:内部函数引用外部函数
    console.log(count);
    }
    fun2();
}
fun();

fun2()执行之前断点,存在闭包

闭包常见面试题_闭包的特点
闭包常见面试题_闭包的特点

fun2()执行之后断点,闭包不在了,因为fun2()执行完成后,作用域销毁,释放内存,里面的闭包同时被销毁

闭包常见面试题_闭包的特点
闭包常见面试题_闭包的特点

闭包的应用场景:

将内部的函数返到外部去

代码语言:javascript
复制
function fun(){
    var count = 1;
    return function (){
    console.log(count);
    }
}
var fun2 = fun();
fun2();
fun2();
闭包常见面试题_闭包的特点
闭包常见面试题_闭包的特点

闭包的优点:

延长外部函数局部变量的生命周期

闭包的缺点:

优点也是缺点,本应被销毁的变量,因为闭包的原因没有被销毁,长期存在的话,容易造成内存泄漏

注意点:

1.合理使用闭包

2.用完闭包要及时清除(销毁),避免内存泄露

基本面试题

代码语言:javascript
复制
function fun(){
    var count = 1;
    return function (){
    count ++
    console.log(count);
    }
}
var fun2 = fun();
fun2();
fun2();

fun2()分别输出什么?

2/3

分析:

第一次执行return匿名函数执行count++ ,输出count = 2

第二次执行闭包起作用,第一次为被销毁

经典面试例题:

代码语言:javascript
复制
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)

函数内部有函数就已经满足了闭包的条件。

代码语言:javascript
复制
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恒成立,所以:

代码语言:javascript
复制
var a = fun(0)
a.fun(1)
a.fun(2)
a.fun(3)

输出为:undefined,0,0,0

b部分:

代码语言:javascript
复制
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为多少

例如:

代码语言:javascript
复制
var x = fun(0).fun(1).fun(2).fun(3).fun(12).fun(33).fun(78)

输出依次为:undefined/0/1//2/3/12/33

c部分:

代码语言:javascript
复制
var c = fun(0).fun(1)
c.fun(2)
c.fun(3)

输出依次:undefined/0/1/1

前端面试官问闭包,怎样回答脱颖而出_不爱吃糖的程序媛的博客-CSDN博客_前端面试闭包该怎么回答

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/178795.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档