如何理解Js中闭包

闭包(Closure)是JavaScript中的一个重要概念,它指的是函数能够记住并访问它的词法作用域(lexical scope),即使这个函数在其词法作用域之外执行。简而言之,闭包允许你从内部函数访问外部函数的变量,即使外部函数已经执行完毕并返回。

闭包的形成

闭包的形成通常涉及两个函数:一个外部函数和一个内部函数(也称为嵌套函数)。内部函数可以访问外部函数的变量,即使外部函数的执行已经结束,这些变量仍然可以在内部函数中被访问。

示例代码

以下是一个简单的闭包示例:

function outerFunction(outerVariable) {  return function innerFunction(innerVariable) {  console.log(`Outer Variable: ${outerVariable}`);  console.log(`Inner Variable: ${innerVariable}`);  };  
}  const closure = outerFunction('Hello');  
closure('World');

在这个例子中:

  1. outerFunction 是一个外部函数,它接受一个参数 outerVariable 并返回一个内部函数 innerFunction
  2. innerFunction 是一个内部函数,它接受一个参数 innerVariable 并打印出 outerVariable 和 innerVariable
  3. 当我们调用 outerFunction('Hello') 时,返回了一个 innerFunction 的引用,并将其赋值给 closure
  4. 即使 outerFunction 已经执行完毕,closure 仍然可以访问 outerVariable,因为 innerFunction 记住并保持了对其词法作用域的引用。
var a=1;
(function(){console.log(a);var a=2;a++;
})();

 这段代码执行后输出是undefined

应为闭包内部无法访问到外部的定义的a变量。

闭包的应用

闭包在JavaScript中有许多应用,包括:

  1. 数据私有化:通过闭包,可以创建私有变量,这些变量只能通过特定的函数访问和修改。
  2. 回调函数:在异步编程中,闭包常用于作为回调函数,因为它们可以访问和修改其外部作用域中的变量。
  3. 模拟块级作用域:在ES6之前,JavaScript没有块级作用域(只有函数级作用域),闭包可以用来模拟块级作用域的行为。
  4. 工厂函数:闭包可以用于创建具有私有状态的对象或函数。

注意事项

  • 内存泄漏:由于闭包可以保持对其外部作用域的引用,如果不小心使用,可能会导致内存泄漏。因此,在不再需要闭包时,应该确保及时释放它们所占用的资源。
  • 性能问题:频繁创建和销毁闭包可能会影响性能,因为每个闭包都会占用一定的内存空间。

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

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

相关文章

clickhouse运维篇(三):生产环境一键生成配置并快速部署ck集群

前提条件:先了解集群搭建流程是什么样,需要改哪些配置,有哪些环境,这个文章目的是简化部署。 clickhouse运维篇(一):docker-compose 快速部署clickhouse集群 clickhouse运维篇(二&am…

快速入门kotlin编程(精简但全面版)

注:本文章为个人学习记录,如有错误,欢迎留言指正。 目录 1. 变量 1.1 变量声明 1.2 数据类型 2. 函数 3. 判断语句 3.1 if 3.2 when语句 4. 循环语句 4.1 while 4.2 for-in 5. 类和对象 5.1 类的创建和对象的初始化 5.2 继承 5…

云原生Istio基础

一.Service Mesh 架构 Service Mesh(服务网格)是一种用于处理服务到服务通信的专用基础设施层。它的主要目的是将微服务之间复杂的通信和治理逻辑从微服务代码中分离出来,放到一个独立的层中进行管理。传统的微服务架构中&#x…

Android -- 调用系统相册之图片裁剪保存

前言 最近线上反馈,部分vivo手机更换头像时调用系统相册保存图片失败,经本人测试,确实有问题。 经修复后,贴出这块的代码供小伙伴们参考使用。 功能 更换头像选择图片: 调用系统相机拍照,调用系统图片…

【Linux刷题练习】

题目 1 题目:Linux 文件权限 -rwxr-xr-x 是什么意思,怎样变更文件夹以及下面所有文件的拥有者? 正确答案:A 知识点: 文件权限: -rwxr-xr-x 表示文件权限: 第一个 - 表示文件类型,…

Android:ViewPaper动态添加移除第一页

问题: 动态改变itemList之后,调用notifyDataSetChanged();没有作用。 原因: 原因是PagerAdapter内部的getItemPosition方法获取的值是固定POSITION_UNCHANGED,表示未改变,所以不更新。 解决: 要更新则…

嵌入式——STM32外设应用

STM32 微控制器以其高性能、低功耗和丰富的外设资源,在嵌入式系统设计中得到了广泛应用。以下将详细介绍 STM32 的主要外设及其典型应用,帮助开发者更好地理解和应用这些功能。 1. GPIO(通用输入输出端口) 功能:GPIO…

【网页布局技术】项目五 使用CSS设置导航栏

《CSSDIV网页样式与布局案例教程》 徐琴 目录 任务一 制作简单纵向导航栏支撑知识点1.合理利用display:block属性2.利用margin-bottom设置间隔效果3.利用border设置特殊边框 任务二 制作简单横向导航栏任务三 制作带图片效果的横向导航栏任务…

C++集合运算函数总结-

集合必须是有序的, merge:将两个有序范围合并到一个新的有序范围中。 set_union:将两个有序集合的并集存储到第三个集合中。 set_difference:将第一个有序集合中不在第二个有序集合中的元素存储到第三个集合中。 set_symmetri…

LeetCode20:有效的括号

原题地址:. - 力扣(LeetCode) 题目描述 给定一个只包括 (,),{,},[,] 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合…

架构师之路-学渣到学霸历程-33

Nginx的常用命令 nginx的重点在于配置文件,但是我们也得懂得这些命令怎么使用的; 先了解一下nginx的命令;如下面笔记~! 1、Nginx命令 Nginx的命令: 如果用yum安装的话,默认会添加到PATH路径如果用源码安…

银河麒麟v10 xrdp安装

为了解决科技被卡脖子的问题,国家正在大力推进软硬件系统的信创替代,对于一些平时对Linux操作系统不太熟练的用户来讲提出了更高的挑战和要求。本文以银河麒麟v10 24.03为例带领大家配置kylin v10的远程桌面。 最近公司为了配置信创开发新购了几台银河麒…

什么是x86架构,什么是arm架构

什么是 x86 架构? x86 架构是一种经典的指令集架构(ISA),最早由英特尔在 1978 年推出,主要用于 PC、服务器等领域。 它是一种复杂指令集计算(CISC)架构,支持大量的复杂指令和操作&…

客户的奇葩要求—在CAN网络的基础上加入了CAN_FD的节点

1:客户的奇葩要求 最近的工作中,遇到了一个有点奇葩的事,客户需要开发一个系统,我们负责其中的一个ECU,这个系统采取的是经典11bit ID的CAN网络。 今天突然提了一个要求,说要在网络中,加入支持…

uniapp 实现本地二维码 二维码中间增加图片不显示(显示白块)

使用 uni.getImageInfo({ }) 转化 将 图片地址转化成本地预览地址 initUrqCode(){// let logo http://mujiachaoshi.kiss55.com/78aca7812fd801f8e6d4d4482af70d38uni.getImageInfo({src: this.user.photo,success: (res) > {// 获取uQRCode实例var qr new UQRCode();// …

4G 模组的 FTP 应用:技术科普

众所周知FTP协议包括两个组成部分,其一为FTP服务器,其二为FTP客户端,今天我将为大家带来一场4G 模组的 FTP 应用技术科普: 以低功耗模组Air780E核心板为例。 1、FTP 概述 FTP(File Transfer Protocol,文件…

PAT甲级-1074 Reversing Linked List

题目 题目大意 给一个链表的头结点和总节点个数,以及k。每k个节点的链表都要翻转。 思路 链表可以用一个结构体数组来存储,先遍历一遍,过滤掉不在链表中的节点。然后将过滤好的节点放入res数组中,每k个元素用一次reverse()&…

go语言gin框架平滑关闭——思悟项目技术2

目录 前言 直接关闭的缺陷 平滑关闭的使用场景 例子 思悟项目: golang qq邮件发送验证码——思悟项目技术1 前言 平滑关闭(graceful shutdown)是指在停止服务时,能够让现有的连接、任务或者操作优雅地完成,而不是…

44-RK3588s调试 camera-engine-rkaiq(rkaiq_3A_server)

在RK3588s平台上调试imx415 camera sensor 过程中,已经识别到了camera sensor ID,并且可以拿到raw图和isp处理后的图像,但是isp处理后的图像偏绿,来看查看后台服务发现rkaiq_3A_server没有运行,然后单独运行rkaiq_3A_s…

Python 变量在函数中的作用域

什么是局部变量? 作用范围在函数内部,在函数外部无法使用 什么是全局变量? 在函数内部和外部均可使用 如何将函数内定义的变量声明为全局变量? 使用global关键字, global变量 练习: 演示局部变量 #…