闭包基本知识汇总

news2024/12/24 3:40:47

闭包基本知识汇总

一、什么是闭包?

闭包是指有权限访问另一个函数作用域中的变量的函数,在Javascript中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成 “定义在一个函数内部的函数” 。所以,在本质上,闭包就是将函数内部和函数外部连接起来的一座桥梁。闭包是一种JavaScript特有的一种函数结构(一种嵌套用法)。

二、闭包的特性:

  1. 函数嵌套:函数嵌套函数,内层函数使用了外层函数的变量(参数);

  2. 局部变量:在函数内定义具有共享意义的局部变量;—— 函数作用域

  3. 外部使用:内层函数被返回到外部 在外部调用,外部可通过这个内层函数访问声明在函数中的局部变量,而此变量在外部是无法通过其他途径被访问的;—— 这里的“返回”包括但不仅限于return;

  4. 词法环境不同:每个闭包都有它自己的词法环境;—— 词法作用域:根据源代码中声明变量的位置来确定该变量在何处可用。

  5. 变量不被回收:外层函数中,被引用的变量(参数)不会立即被垃圾回收机制回收;

三、闭包的作用:

  1. 使用闭包,可以延长局部变量的生命周期,由于内层函数使用了外层函数的变量,导致外层函数在执行结束后,变量没有被回收;

  2. 使用闭包,可以隔离作用域,避免被全局污染; —— 😭(window) => { … })(window);

  3. 使用闭包,可以保护具有共享意义的变量, 为其提供相关的操作接口(function),可以用来模拟私有方法

四、闭包的优点:

  1. 数据共享:使用闭包,在外层函数中,被引用的变量(参数)不会立即被垃圾回收机制回收,会一直被保存在内存中,实现数据共享;
  2. 数据私有化:使用闭包,在函数外部能够访问到函数内部的变量,但是它在外部是无法通过其他途径被访问的,实现数据私有化;

五、闭包的缺点:

  • 通过使用闭包,外层函数中被引用的变量(参数)不会立即被垃圾回收机制回收,会一直被保存在内存中,不会被释放,占用内存严重,造成内存泄漏,甚至栈溢出。

内存泄漏:由于疏忽或错误造成程序未能释放已经不再使用的内存

可能会导致栈溢出的场景:递归、自调用、超深循环等

六、简单的面试题

请编写一个简单的闭包

function fn(a) {
    return function(b) {
        console.log(a + b);
    }
}
var fn2 = fn(1);
fn2(5);

请编写一个函数add(3)(5) 让传入的参数相加

function add(a) {
    return function(b) {
        console.log(a + b);
    }
}
add(3)(5);

简单的封装

      
function objFnc() {
  var obj = {
    name: 'zhangsan',
    age: 20
  }
  return {
    get: function() {
      return obj;
    },
    set: function(name, val) {
      obj[name] = val;
      return obj;
    }
  };
}

var data = objFnc(); //* {get: ƒ, set: ƒ}
console.log("%c 🤷‍♀️: data.get() ", "font-size:16px;background-color:#fbf591;color:black;", data.get()) //8 {name: 'zhangsan', age: 20}
data.set('sex', 'man'); //* {name: 'zhangsan', age: 20, sex: 'man'}
console.log("%c 🤷‍♀️: data.get() ", "font-size:16px;background-color:#fbf591;color:black;", data.get()) //* {name: 'zhangsan', age: 20, sex: 'man'}

七、for循环中的闭包导致的错误,及其四种解决方案

详细见另一个文章for循环中的闭包导致的错误,及其四种解决方案,或手机直接扫码即可;

for循环中的闭包导致的错误,及其四种解决方案

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/597034.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI当道,元宇宙赛道是风口还是噱头?

一个新概念的诞生往往要经过无数次的锤炼,宛如一场漫长、深刻的头脑风暴。而发展到今天,处在风口之上,各行各业都急切往元宇宙概念靠拢,元宇宙已经与资本市场共舞。 伴随着全球多家行业巨头的布局以及元宇宙在游戏领域的率先落地…

c#快速入门(上)

欢迎来到Cefler的博客😁 🕌博客主页:那个传说中的man的主页 🏠个人专栏:题目解析 🌎推荐文章:题目大解析2 目录 👉🏻 c#和c不同之处👉🏻程序文件的…

华为OD机试真题 Java 实现【简单的解压缩算法】【2023Q1 200分】,附详细解题思路

一、题目描述 现需要实现一种算法,能将一组压缩字符串还原成原始字符串,还原规则如下: 1、字符后面加数字N,表示重复字符N次。例如:压缩内容为A3,表示原始字符串为AAA。 2、花括号中的字符串加数字N&…

tcpdump 抓包工具详细图文教程(上)

目录 一、tcpdump 抓包工具的基本介绍和学习基础 1.1 常用的抓包工具 1.2 tcpdump 抓包工具介绍 二、tcpdump 抓包工具使用环境和初体验 2.1 编译安装 tcpdump 2.2 抓包 三、讲解 TCP 协议报文报头 四、tcpdump 抓包工具常规过滤规则 4.1 tcpdump 的 host 和 net 过…

Flutter 又一元老离职,感谢 Tim 这些年的付出

前天在 insiders 收到 Tim Sneath 的离职邮件时感觉很震惊,因为他绝对是 Flutter 团队的元老级人物,几乎每次一次 Flutter 版本发布和社区活动都有他的身影,可以说他是我的 Flutter 领路人之一。 Tim 是在 2017 加入 Flutter 团队&#xff0…

SpringCloud微服务踩坑系列:UnknownContentTypeException

错误信息如下: org.springframework.web.client.UnknownContentTypeException: Could not extract response: no suitable HttpMessageConverter found for response type [class com.cyf.internalCommon.dto.ResponseResult] and content type [text/plain;charset…

使用WordPress提高企业敏捷性

喜欢WordPress的原因有很多:该平台非常适合内容管理以及控制预算。此外, 在 提高开发效率和简化项目管理方面,WordPress可以通过多种方式提供帮助。 对于任何企业业务,目标始终是在不影响质量的情况下更快地启动项目、发布修复和…

day3 -- select语句学习

文章目录 数据库和表的准备selectselect order byselect whereselect 高级过滤操作使用通配符进行过滤使用正则表达式进行搜索 数据库和表的准备 下载《mysql必知必会》提供的脚本用于创建样例表 cd /mnt/d/unix_dir wget https://forta.com/wp-content/uploads/books/067…

【Linux从入门到精通】进程的状态

当我们了解到进程是什么东西后,我们再来看看进程都会有那些状态。本篇文章会对进程的不同状态进行详解,希望会对你的理解有所帮助! 文章目录 一、了解进程的不同状态 二、详解进程的不同状态 2、1 R运行状态(running) …

开源赋能 普惠未来|中软国际寄语 2023 开放原子全球开源峰会

中软国际作为行业领先的全球化软件与信息技术服务企业及数字化转型服务商,近年来积极布局开源生态(OpenHarmony、openEuler)、智能云、ERP、AIGC、教育科技、智能车六大赛道,加速业务转型创新。 中软国际为开放原子开源基金会白金…

文字环绕图片效果实现

书接上回,我们来讲讲如何实现“文字环绕图片”的效果吧。整体预计实现的效果如下: 日常杂谈 我喜欢看动漫,接下来的所有博客都会和我日常生活结合在一起写,这样感觉会让自己的博客会有温度,我感觉每个人都应该有自己的…

最新喜讯|易知微入选2023数字孪生解决方案提供商TOP50

近日,互联网周刊发布《2023数字孪生解决方案提供商TOP50》,杭州易知微科技有限公司在榜。 中国科学院主管的《互联网周刊》,创刊于1998年,是中国最具公信力的杂志之一,其颁布的榜单极具权威性与专业度,对产…

基于非局部图注意力网络的鲁棒三维形状分类

文章目录 Robust 3D Shape Classification via Non-local Graph Attention Network摘要本文方法Global Structure Network (GSN)Global Relationship Network (GRN)Local Feature Learning based on MLP-STNetwork Channel Fusion ModuleGlobal descriptor 实验结果 Robust 3D …

分布式锁的应用场景与分布式锁实现(四):基于MySQL实现分布式锁与分布式锁总结

分布式锁的应用场景与分布式锁实现(三):基于Zookeeper实现分布式锁 基于MySQL实现分布式锁 ​ 不管是JVM锁还是MySQL锁,为了保证线程的并发安全,都提供了悲观独占排他锁。所以独占排他也是分布式锁的基本要求。 ​ …

在can协议的基础下编写DBC文件,然后使用该DBC文件下发can协议到底盘完整流程

目录 前言一、VectorCANdb下载及安装二、DBC文件的编写1.新建dbc文件2.建立dbc2.1根据CAN协议设置以下的signals2.2设置报文2.3建立报文与信号的关系2.4建立节点 三、编写程序使用UDP通信下发can协议1.查看can口、电脑ip以及端口号2.编写测试程序 前言 最近完成了一个项目&…

热烈庆祝兴业法拍网与宁波银行北京分行签订“法拍贷”业务合作

6月1日,兴业法拍网与宁波银行北京分行签订“法拍贷”合作协议。 “法拍贷”是以法院房产拍卖为核心、线上平台拓宽拍卖渠道、保险公司提供阶段性保证、公证机构加大司法效力、银行提供全程金融服务的“14”创新合作模式。该模式汇聚五方合力让更多竞拍人享受到便利…

2天时间3个面试,百度进了3面!

昨天和朋友复盘了一下最近的面试经历,分享给大家: 关于就业环境 忠告:如果不是在二三线买车买房结婚生子了,还是到一线城市去吧。 或者换个行业! 关于焦虑和摆烂 如果你也在焦虑迷茫、精神内耗。找阳哥给你做“心理…

spring-boot版本影响Spring AOP @Before @Around @After等执行顺序

郁闷了半天,我通过AOP切面打印的日志顺序怪怪的,网上查了好几篇文章都说没问题,最后发现是springboot版本升级后Before Around After等执行顺序发生了变化。 1.切面类 Aspect// 这是一个切面 Component// 这是一个需要被装配的spring bean S…

零基础如何实现 Python 自动化办公 ?

996 一直是互联网老生常谈的话题了,但抛开其他只谈工作本身,你有没有想过,下班晚、加班,有时候可能是因为自己工作比较低效? 在这给你分享一个案例: 场景是在维护日活超过 3 亿用户的微博私信平台&#x…

Linux开机rc.local不自启动执行脚本其他一些问题进行补充说明

Linux开机rc.local不自启动执行脚本其他一些问题进行补充说明 在上一篇,我们讲了Linux开机rc.local不自启动执行脚本问题的排查思路及问题解决 这一篇我们补充一些其他的问题 问题一:我怎么知道我rc.local里面的命令启动成功不成功呢,我怎…