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

闭包常见面试题_闭包的特点理解:什么是闭包?1.密闭的容器,类似set/map容器,用来存储数据2.闭包是一个对象,存放数据的格式:key:value闭包形成的条件1.函数嵌套2.内部函数引用外部函数functionfun(){varcount=1;functionfun2(){//条件1:函数嵌套//形成条件2:内部函数引用外部函数console.log(count);}}fun();已经形成了闭包,以键值对的形式保存数据在外部.

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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账号...

(0)


相关推荐

  • box-sizing:border-box的理解和作用

    box-sizing:border-box的理解和作用要想清楚这个属性的作用,首先要理解盒子模型盒子模型是指:外边距(margin)+border(边框)+内边距(padding)+content(内容)可以把每一个容器,比如div,都看做是一个盒子模型比如你给一个div设置宽高为500px,但实际你设置的只是content,之后你又设置了padding:10px;border:1pxsolidred;这时div的宽高就会变为544px(content500px+padding40px+border4px)相当于一个元素的实际宽高是由

    2022年10月26日
  • PHP程序员如何突破成长瓶颈(php开发三到四年)

    PHP程序员如何突破成长瓶颈(php开发三到四年)

    2021年10月16日
  • Android微信支付订单支付失败的问题

    Android微信支付订单支付失败的问题Android开发使用微信支付,如果说SDK集成正确,然后订单信息配置无误,就是调不起来支付页面,那就要考虑一下微信缓存的问题。当我们的APP需要更换签名,或者说替换Ping++的SDK,就要考虑微信缓存导致新版本调不起来支付页面。我们只要将微信退出一次就OK了。最奇葩的是我从服务器获取订单信息的接口从本地替换成正式的,就调不起来微信支付页面了,还好尝试了一下退出微信一次,就能够成功地调起支付…

  • vue 二维码生成_二维码图片生成器

    vue 二维码生成_二维码图片生成器本文主要介绍vue生成二维码一、qrcode1.1效果图npminstall–saveqrcodejs21.2关键代码<template> <divclass=”qrcode”ref=”qrCodeUrl”></div></template><script>importQRCodefrom’qrcodejs2’exportdefault{name:”Index”,data(){.

  • centos开启关闭防火墙(电脑防火墙关闭有什么影响)

    CentOS6:1)永久性生效,重启后不会复原开启:chkconfigiptableson关闭:chkconfigiptablesoff 2)即时生效,重启后复原service iptables status    查看防火墙状态service iptables start     开启防火墙service iptab…

  • roslyn 生成代码_delphi反编译为源码

    roslyn 生成代码_delphi反编译为源码Roslyn是微软公司开源的.NET编译器。编译器支持C#和VisualBasic代码编译,并提供丰富的代码分析API。GITHUB地址:https://github.com/dotnet/roslyn.gitRoslyn在vs2013上通过在ManageNuGetPackages中下载安装Microsoft.CodeAnalysis、Microsoft.

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号