前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >【前端芝士树】Js中的闭包是怎么一回事 && 笔试问题集锦

【前端芝士树】Js中的闭包是怎么一回事 && 笔试问题集锦

作者头像
CloudCat
发布于 2022-05-06 07:35:08
发布于 2022-05-06 07:35:08
23800
代码可运行
举报
运行总次数:0
代码可运行

【前端芝士树】Js中的闭包是怎么一回事 && 笔试问题集锦

为什么会有闭包的出现?

这涉及到var作为变量声明的关键词时所出现的一些问题。 比如,var 的 变量提升 以及 函数级作用域

Javascript语言的特殊之处,就在于函数内部可以直接读取全局变量。 另一方面,在函数外部自然无法读取函数内的局部变量。

需要注意的是,如果在函数内部声明变量时没有使用var关键词,实际上声明的是一个全局变量,如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function f1(){
    n = 999;
}
//console.log(n); // ReferenceError: n is not defined
f1();
console.log(n); // 999

这里为什么第一处会报错呢?关于这个问题下面有比较基础的解释:

JS的解析过程分为两个阶段:预编译期(预处理)执行期

  • 预编译期 JS会对本代码块(两个script块互不影响)中的所有var声明的变量和函数进行处理(类似与C语言的编译) 此时处理函数的只是声明式函数,而且变量也只是进行了声明但未进行初始化以及赋值。>
  • 执行期 会按照代码块的顺序筑行执行

正因为从外部访问在函数内部进行声明的局部变量是不可能的,所以出现了闭包这种形式,在函数内部再定义一个函数。

闭包(Closure)是什么?

查阅了一些文章和资料,发现还是下面的定义最容易理解:

闭包:定义在函数内部的一个函数。

扩展一些讲,可以参考一下阮一峰的讲解:

闭包:能够读取其他函数内部变量的函数。

俗话说的好,看定义不如看代码更直观一些,如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function f1(){
    var n=999;
    function f2(){
        console.log(n);
    }
    return f2;
}

var result=f1();
result(); // 999

如此段代码所示,f2()就是其中的闭包函数,通过f2()我们可以访问到f1()内部的n。 更常见的一种简写形式:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function f1(){
    var n=999;
    return function(){
        console.log(n);
    };
}

var result=f1();
result(); // 999

闭包的优缺点

优点:

  1. 可以读取函数内部的变量
  2. 让这些变量的值始终保持在内存中。

缺点:

  1. 由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
  2. 闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值。

闭包面试题集锦(持续更新)

问题一、简单闭包
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var a = 1;
function foo(){
    var a = 2;
    c = 0;
    return function () {
        console.log(a);
        console.log(b++);
        console.log(c);
    }
}
console.log(a);// 1

//console.log(c); // Reference Error
var b = 3;
var x = foo();
x(); //2 3 0
console.log(a); // 1
console.log(b); // 4
console.log(c); // 0
问题二、闭包的链式调用
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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:function(){}},里面有一个函数作为属性,这个函数就是闭包,使得函数内部的变量保留在内存中。

注意,这里会有一个可能误解的地方,return {fun:...}里面的fun是fun(n,o)吗?明白这个区别后后面就容易多了。

好了,明白大概的原理后,我们来分析这个问题:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);

执行a = fun(0),0是作为n传入的,o没有参数传入,所以输出undefined,之后,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
a = {
  fun:function(m){
     return fun(m,0);//这里的n应该变成了第一次调用时的参数n,也就是0
  }
}
也就是
a = {
 fun:function(m){
     return function(n = m, o = 0) {
         console.log(o) //输出0
         return {
            fun:function(m){
              return fun(m,n);
            }
          };
    };
  }
}

所以无论传入的m是什么,输出永远都是0 最后,输出结果如下

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var a = fun(0);  a.fun(1);  a.fun(2);  a.fun(3);
undefined
0
0
0

搞清楚第一个的过程,第二个的破解关键就在于闭包让函数内部的变量始终保存在内存之中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//b
undefined
0
1
2
//c
undefined
0
1
1

参考文章

《学习Javascript闭包(Closure) - 阮一峰的网络日志》 《闭包 - 廖雪峰的官方网站》

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

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

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
雨量传感器接线图_雨量感应器在哪里
雨量光照传感器(RLS)是将红外式雨量传感器以及环境光传感器集成于一体的新一代车载智能传感器。配有RLS的车辆可以实现前雨刮和前大灯的自动控制,替代原有手动操作,提高了驾车的安全性和舒适性。
全栈程序员站长
2022/11/10
6610
雨量传感器接线图_雨量感应器在哪里
红外雨量计(光学雨量传感器)在预防地质灾害中怎样发挥作用
红外雨量计是一种利用红外线原理测量雨量的设备。在预防地质灾害中,红外雨量计可以发挥以下作用:
河北稳控科技
2023/07/11
1630
红外雨量计(光学雨量传感器)在预防地质灾害中怎样发挥作用
IFR202型红外雨量传感器
IFR202型红外雨量传感器是专用于测量降雨量的仪器,拥有知识产权,采用光学扫描原理,实现雨滴大小及雨滴数量的实时扫描,进而计算出降雨量输出。支持脉冲输出与RS232输出当使用脉冲输出功能时,可以完全替代翻斗式雨量计。
HB稳控科技
2022/12/09
3600
IFR202型红外雨量传感器
光学红外雨量传感器对比翻斗式雨量计测量降雨量优势
IFR202型红外雨量传感器是通过红外扫描原理非接触式检测降雨量的传感器,广泛应用于智慧灌溉,自动门窗,地质灾害等行业。
河北稳控科技
2022/06/02
4850
光学红外雨量传感器对比翻斗式雨量计测量降雨量优势
红外雨量计(光学雨量传感器)检测降雨量,预防内涝
随着城市化进程的加快,城市内涝成为一个愈发严峻的问题。短时间内大量的降雨,不仅会给城市交通带来困难,也会对城市的基础设施和居民的生活造成很大的影响。因此,有效预防内涝也成为城市管理者和居民关注的焦点。
河北稳控科技
2023/08/01
2010
红外雨量计(光学雨量传感器)检测降雨量,预防内涝
红外雨量计(光学雨量传感器)调试
红外雨量计是一种用来测量雨量的传感器,它通过红外线的反射来检测雨滴的落下。为了调试红外雨量计,你需要参考以下步骤:
河北稳控科技
2023/07/26
2670
红外雨量计(光学雨量传感器)调试
红外雨量计(光学雨量传感器)在农业智慧灌溉的应用
智慧灌溉是一种利用现代科技手段实现农田灌溉自动化的方式,它可以有效的提高水利资源利用效率,减轻农民劳动强度,提高作物产量和品质,同时还可以减少水浪费和土地污染。在智慧灌溉系统中,红外雨量计是一种重要的传感器,它能够快速、准确的检测降雨量,从而为农田灌溉提供实时的数据支持。
河北稳控科技
2023/06/29
2130
红外雨量计(光学雨量传感器)在农业智慧灌溉的应用
工程监测无线中继采集发送仪 指示灯功能说明及接口定义
POW 电源指示 常亮 外部电源已连接 仅用于指示是否连接了外部电源 熄灭 无外部电源
河北稳控科技
2023/05/10
2680
工程监测无线中继采集发送仪 指示灯功能说明及接口定义
光学雨量计:更灵敏可靠、更智能的降雨监测工具
降雨量信息是评估大气环境和降水研究的关键指标,也是环境监测和农业安全监测的重要参数。目前,我们通常使用翻斗式或光学雨量计来监测降雨量,这些工具能够感知自然界的降雨量,并将其转换为相应的开关信号输出,以满足信息传输、处理、记录和显示的需求。
河北稳控科技
2023/11/01
2840
光学雨量计:更灵敏可靠、更智能的降雨监测工具
环保数采仪助力空气质量在线监测系统
空气的质量和人民生活健康息息相关。目前,空气污染源影响空气质量的最主要因素之一是来自固定和流动污染源的人为污染物排放,包括车辆、船舶、飞机的尾气、工业污染、居民生活和取暖、垃圾焚烧等。
用户7348788
2020/06/23
6460
关于红外雨量计(光学雨量传感器)的红外光学测量技术
红外雨量计是一种常用的雨量测量设备,它通过红外光学测量技术来测量雨量。红外光学测量技术是指利用光学原理和仪器对物体的红外辐射进行测量、分析和处理。在红外雨量计中,利用红外光学测量技术来测量雨滴的大小、数量以及落下的速度,从而间接地推算出降雨量。
河北稳控科技
2023/08/11
4360
关于红外雨量计(光学雨量传感器)的红外光学测量技术
振弦传感器的发展及信息化的核心技术-VM系列振弦采集模块
振弦传感器的历史堪称古老,历经一百年仍经久不衰,目前仍是各种传感器的主流支撑技术。以下从一篇生动的文章开始介绍振弦传感器的前世今生,这篇文章是是振弦传感器发明人阿明•沃斯(Armin Wirth)后代约翰内斯(Johannes Wirth)发表于互联网的。
河北稳控科技
2022/08/15
4200
振弦传感器的发展及信息化的核心技术-VM系列振弦采集模块
CMOS图像传感器基础知识和参数理解「建议收藏」
CMOS图像传感器的工作原理:每一个 CMOS 像素都包括感光二极管(Photodiode)、浮动式扩散层(Floating diffusion layer)、传输电极门 (Transfer gate)、起放大作用的MOSFET、起像素选择开关作用的M0SFET.在 CMOS 的曝光阶段,感光二极管完成光电转换,产生信号电荷,曝光结束后,传输电极门打开,信号电荷被传送到浮动式扩散层,由起放大作用的MOSFET电极门来拾取,电荷信号转换为电压信号。所以这样的 CMOS 也就完成了光电转换、电荷电压转换、模拟数字转换的三大作用,通过它我们就能把光信号转化为电信号,最终得到数字信号被计算机读取,这样,我们就已经拥有了记录光线明暗的能力,但这还不够,因为我们需要色彩。现代彩色CMOS 的原理也很简单,直接在黑白图像传感器的基础上增加色彩滤波阵列(CFA),从而实现从黑白到彩色的成像。很著名的一种设计就是Bayer CFA(拜耳色彩滤波阵列)。一个很有趣的事就是,我们用来记录光影的 CMOS, 和我们用来输出光影的显示器,原理也刚好是向相反的,CMOS 把光转化为电信号最后以数字格式记录,显示器把解码的数字格式从电信号重新转化为光。光电之间的转换也就构成了我们人类数字影像的基础。
全栈程序员站长
2022/08/30
4K0
CMOS图像传感器基础知识和参数理解「建议收藏」
VS208~432型振弦传感器无线采集仪应用工程项目监测
VS208-432型振弦传感器无线采集仪是结合多年的项目实际及产品研发经验 而研发的一款安装方便、实用性强、性能稳定、数据远传、成本低廉的振弦型数据采集仪产品特别适合野外无人环境。
河北稳控科技
2022/05/25
2370
VS208~432型振弦传感器无线采集仪应用工程项目监测
穿梭车如何高效、可靠运行,宜科传感器给您最优解
四向智能穿梭车是一款既能实现纵向行走也可横向行走的智能搬运设备,集原地换轨、自动搬运、智能监控和交通动态管理等功能于一体。其灵活性、柔性度高,适用于高密集货架,可实现任意穿梭,灵活调整。
用户9868602
2022/09/02
2870
穿梭车如何高效、可靠运行,宜科传感器给您最优解
多通道振弦传感器无线采集仪如何外接数字传感器
VS 设备支持在 RS485 接口外接数字传感器, 可进行单类型、多类型数字传感器接入。
河北稳控科技
2023/04/20
2350
多通道振弦传感器无线采集仪如何外接数字传感器
红外雨量计(光学雨量传感器)安装注意要点
红外雨量计是一种用来测量降雨量的设备,它采用了先进的红外线技术,可以非常精确地测量降雨量,并可自动记录数据。在红外雨量计的安装过程中,需要注意以下要点:
河北稳控科技
2023/07/25
2020
红外雨量计(光学雨量传感器)安装注意要点
全国产压力传感器选型
压力传感器是指将接收到的气体、液体等压力信号转变成标准的电流信号(4~20mADC),以供给指示报警仪、记录仪、调节器等二次仪表进行测量、指示和过程调节的元器件。它主要是由测压元件传感器、测量电路和过程连接件等组成的(进气压力传感器)。
武汉利又德科技
2024/06/12
1240
红外雨量计(光学雨量传感器)在监测降雨量的应用
红外雨量计是一种基于红外光学原理的降雨量监测设备。它利用红外传感器检测雨滴落在传感器上时所产生的反射光信号,根据信号的强弱和持续时间计算出降雨强度和累计降雨量。
河北稳控科技
2023/07/10
1830
红外雨量计(光学雨量传感器)在监测降雨量的应用
多通道振弦传感器无线采发仪VS-BOX 接口定义-传感器接口
VS-Box 是以振弦、温度传感信号为主的多通道无线采发仪,并可扩展其它模拟(电流、电压、电阻)信号和数字信号( RS485、 RS232)传感器通道,内置电池,可外接太阳能电池板。最多可实现 32 通道的全自动采集存储和无线发送,支持内部及外部 U 盘数据存储; 1 路程控电源输出可为其它传感器供电;RS232/RS485 数据接口。
河北稳控科技
2022/10/11
4610
多通道振弦传感器无线采发仪VS-BOX 接口定义-传感器接口
推荐阅读
相关推荐
雨量传感器接线图_雨量感应器在哪里
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验