Js中闭包的概念和具体使用

news2024/11/19 23:17:08

前言

闭包在js里面是一个比较抽象的概念,但在面试里,是一个必问的话题,往往面试官希望你列举一些使用闭包的例子或手写一个闭包

闭包,简单一句话讲就是能够读取其他函数内部变量的函数,当需要函数内容部的变量被外部的代码所访问时

那闭包就非常有用了的,如今,很多框架里面的高级特性都得依赖闭包的

01

示例代码

function a() { // 定义函数a
    var n = 100; // 定义一个局部变量n
    var b = function() { // 定义函数b
        n++; // n自加1
        return n; // 返回n的值
    }
    return b; // a函数的返回结果值为函数b
} 

var c = a(); // 执行a函数,得到b,并赋值c
c(); // c函数执行n的值变为101
alert(c()); // 在打印一次值,却变量102

02

分析

这个局部变量的函数会被保存下来,在函数外部,是没有办法直接访问函数里面的变量的,但是通过闭包却可以

也就是说,它是用来连接内部函数与外部函数的一个桥梁,闭包产生的本质原因,是作用域链引起的,从而达到外部函数访问内部函数局部变量的目的,其中被嵌套函数就可以称为是一个闭包

闭包的真正目的,就是要把局部的函数永久的保存下来,被外部的变量和代码所访问和使用

当a函数中内部的函数被a函数以外的函数所访问到,那就可以称为一个闭包

闭包最常见的用途就是把一个变量永久的保存下来,而不是随着函数的执行完毕而被js的垃圾回收器所回收

那这样,也会带来一个问题,就是内存得不到及时的回收,有可能会产生内存溢出的危险,具体的解决办法就是,退出函数之前,将不使用的局部变量全部删除清空就可以了

如果你把父函数当做对象使用,把闭包当做它的公有方法,把内部变量当做它的私有属性,这时候,要注意不要随便的改变父函数的内部变量的值

03

闭包的用途

  1. 对外提供公有属性和方法(也就是函数外部读取函数内的局部变量)

  2. 保存变量于内存中,避免全局变量的污染(上面的一个示例就是的,局部变量被保存下来了的)

  3. 有时候需要一个模块中定义这样的变量,执行某些操作后,始终保存上一次的值,希望这个变量一直保存在内存中,但又不会污染全局变量,这个时候,我们就可以使用闭包

总结

bb2ce18bb164d947f3516648940814f0.gif

闭包的概念比较抽象,但是在js里面是一个非常重要的知识点,涉及到如何访问读取和修改变量,可以对外提供公有的属性和方法,保存变量于内存当中,避免全局变量的污染

VueJs中如何自定义hooks(组合式)函数

2023-01-06

4bf86800a6fc11bce368f1be6d1b3577.jpeg

js如何引用同级元素

2023-01-05

0f1b6755417ec98b411a73c942421f9c.jpeg

JS如何实现倒计时效果

2023-01-04

9a24e584c77e902f1570820748165cdf.jpeg

JS如何实现根据不同的时间段显示不同的欢迎语

2023-01-04

86313bcc060bd15cf425d1bf90ac46a2.jpeg
点击左下角查看更多

10154b7f14d6b895304bebc8f63c9c78.gif

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

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

相关文章

Spring整合Mybatis和Junit

文章目录1 Spring整合Mybatis环境搭建整合步骤使用的注解详解2 Spring整合Junit整合Junit步骤使用的注解详解1 Spring整合Mybatis 大体需要做两件事, 第一件事是:Spring要管理MyBatis中的SqlSessionFactory 第二件事是:Spring要管理Mapper接口的扫描 具体该如何实现…

6.Isaac教程--在 C++ 中开发 Codelet

在 C 中开发 Codelet 本教程的目标是用 C 开发两个小码:第一个实际上是一台“ping”的机器,而第二个侦听并摄取“ping”消息。 对于本教程,不需要外部依赖项或特殊硬件。 文章目录在 C 中开发 Codelet创建新应用程序为应用程序创建一个新目录…

【Linux】Linux的基本指令(一)

文章目录1、ls 指令2、pwd 命令3、cd 指令4、touch 指令5、mkdir 指令6、rmdir和rm 指令7、man 指令8、cp 指令9、mv 指令10、cat11、echo(输出,输入,追加重定向)12、wc13、more14、less1、ls 指令 语法: ls[选项][目录或文件] 功能&#xff…

2. 矩阵(matrix)、数组、列表(list)、数据框(data.frame.....)

课程视频链接:https://www.bilibili.com/video/BV19x411X7C6?p1 本笔记参照该视频,笔记顺序做了些调整【个人感觉逻辑顺畅】,并删掉一些不重要的内容 系列笔记目录【持续更新】:https://blog.csdn.net/weixin_42214698/category_…

电脑总是开机黑屏,开机两次才能成功的解决办法:更新BIOS(七彩虹H410M-T PRO)

参考:七彩虹主板更新BIOS的方法 前段时间电脑出问题了,每当我第一次开机都会黑屏,要强制关机第二次开能开机,导致每次都开机很久很久,心情也不好 有时候开机等他一会,大概两分钟,会报如下错误&a…

C++课程成绩管理与分析系统[2023-01-07]

C课程成绩管理与分析系统[2023-01-07] C实习指导书 编写:潘林 修订:邓吉秋 一、实习目的 学生通过此次实习, 应达到如下要求: 熟练使用一种 C开发环境,包括 IDE 与编译器;掌握 C程序的编写 过程与调试&…

Sentinel 是什么

Sentinel是什么 Sentinel 官网:introduction | Sentinel 随着微服务的流行,服务与服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统负载保护等多个维度保护服务的稳定性。 Sentinel 具有以下特征 丰富…

Rancher部署分布式任务调度系统XXL-JOB通过拉取Docker公共镜像方式

通过Rancher部署分布式任务调度系统XXL-JOB我了解到有两种方式,一种是拉取xxl-job的源代码打包通过Jenkins部署,另一种简单的是直接拉取官方镜像,本文主要讲后面这种。 1、打开Docker公共镜像仓库,搜索xxl-job,复制镜…

GNN笔记系列 3

GNN笔记系列 21.Graph1.1Directed Graphs1.2Symmetric Graphs1.3Unweighted Graphs2.Graph Shift Operators(GSO)2.1Degree Matrix2.2Laplacian Matrix2.3Graph Shift Operator SSS3.Graph Signals4.Graph Convolutional Filters5.Time convolutions and graph convolutions6.G…

itertools包介绍——可以不用 但不能不知道——python包推荐系列

背景1 今天在看一个开源包,发现他的requirements.txt里面放着more_itertools包。 这个包的名字还是挺有意思的,在itertools包前面加上了一个more。难道是python自带的包itertools的加强版? 后来查了一下,这个包,果然…

高并发系统设计的15个锦囊

记得很久之前,去面试过字节跳动。被三面的面试官问了一道场景设计题目:如何设计一个高并发系统。当时我回答得比较粗糙,最近回想起来,所以整理了设计高并发系统的15个锦囊,相信大家看完会有帮助的。 如何理解高并发系统…

【云原生 | 51】Docker三剑客之Docker Compose第二节

🍁博主简介: 🏅云计算领域优质创作者 🏅2022年CSDN新星计划python赛道第一名 🏅2022年CSDN原力计划优质作者 🏅阿里云ACE认证高级工程师 🏅阿里云开发者社区专…

打卡第11天|力扣20. 有效的括号 、 1047. 删除字符串中的所有相邻重复项 、150. 逆波兰表达式求值 。

今天是打卡第十一天,题目主要是栈结构的运用20. 有效的括号题目链接如下:20. 有效的括号我们挨个遍历字符串,每有一个向左的字符串我们就往栈里面存一个向右的括号,遍历到向右的括号时,如果栈中类型相同就弹出&#xf…

在日本之后,中国也发布新型光刻机,ASML加快对中国出口光刻机

由于美国的影响,ASML对中国出售光刻机一直都在摇摆之中,不过2022年底至少有三家中国芯片企业获得ASML的光刻机,显示出ASML的态度再次发生变化,导致如此结果或许在于中国近期宣布的新型光刻机。一、开辟芯片制造新技术说到绕开ASML…

2022年9月CSP认证题解 如此编码(k进制),何以包邮?(背包问题),吉祥物投票(珂朵莉树、懒标记、并查集)

T1 如此编码 思路 由公式 和前缀乘积定义 得mb1a1b2⋅⋅⋅a1a2⋅⋅⋅an−1bnmb_1a_1\times b_2a_1\times a_2\times\times a_{n-1}\times b_nmb1​a1​b2​⋅⋅⋅a1​a2​⋅⋅⋅an−1​bn​, 上述公式可以提取公共乘项aia_iai​,写成m(bnbn−1⋅⋅⋅…

一文搞懂内存映射原理及使用方法

a. 内存映射原理内存映射即在进程的虚拟地址空间中创建一个映射,分为两种:文件映射:文件支持的内存映射,把文件的一个区间映射到进程的虚拟地址空间,数据源是存储设备上的文件。匿名映射:没有文件支持的内存…

2. 因子(factor)、缺失数据(na)、字符串、时间序列数据

课程视频链接:https://www.bilibili.com/video/BV19x411X7C6?p1 本笔记参照该视频,笔记顺序做了些调整【个人感觉逻辑顺畅】,并删掉一些不重要的内容 系列笔记目录【持续更新】:https://blog.csdn.net/weixin_42214698/category_…

字符的编码与乱码

目录 前言 1 计算机中字符的编码分类 1.1 常见非Unicode编码 1.1.1 ASCII 1.1.2 ISO 8859-1 1.1.3 Windows-1252 1.1.4 GB2312 1.1.5 GBK 1.1.6 GB18030 1.1.7 Big5 1.1.8 编码汇总 1.2、Unicode编码 1.2.1 UTF-32 1.2.2 UTF-16 1.2.3 UTF-8 1.2.4 Unicode编码…

A1032 Sharing

Powered by:NEFU AB-IN Link 文章目录A1032 Sharing题意思路代码A1032 Sharing 题意 To store English words, one method is to use linked lists and store a word letter by letter. To save some space, we may let the words share the same sublist if they share the s…

2032.1.7 学习总结

1.string与int之间的相互转化问题 &#xff08;1&#xff09;int转string&#xff1a;使用to_string函数 引入头文件: #include<string> 转int&#xff0c;float&#xff0c;double都可以 string to_string (int val); string to_string (long val); string to_string…