当前位置: 首页 > news >正文

JavaScript基础——闭包

闭包简介

闭包的作用

        闭包可以保留变量的状态

        闭包可以让变量私有化

闭包的缺点


闭包简介

        在JavaScript中,重复声明同一个变量会导致变量冲突,在这个时候可以使用闭包创建独立的执行环境。

        在JavaScript中,闭包是指封闭的执行环境,指的是一个函数能够记住并访问其创建时所在的作用域,即使这个函数在其原始作用域之外被执行,也就是说一个函数(内部)有权访问另一个(外部)函数作用域的变量。闭包通常由嵌套函数创建,即一个函数内部定义了另一个函数。外层函数可以返回内层函数,而内层函数可以访问外层函数的变量。

        语法如下:

        function 函数名称() {代码块return function () {代码块}}

        定义函数f1,定义f1函数局部作用域的变量user,再定义一个匿名函数作为f1函数的返回值,匿名函数可以访问user,也就是内部函数可以访问外部函数作用域的变量。

        // 局部变量function f1() {var user = '小明';function foo() {console.log("hello" + user);}// 函数也是数据,把这个函数作为f1的返回值,调用f1可以获取fooreturn foo;}// 由f1所形成的封闭环境,叫做闭包var bibao1 = f1();bibao1();

        将f1改为直接使用返回函数return function()的形式。

        function f2() {var user = '小明';return function () {console.log("hello2" + user);}}var bibao2 = f2();bibao2();

        定义一个add()函数,定义局部变量num,在函数中写一个内部函数作为返回值,如果不写这个内部函数的话,每次看到的数值只有0(初始值)。

        add()函数返回了一个闭包,这个闭包能够访问并修改add函数作用域内的变量num。每次调用这个闭包时,它都会增加num的值并打印出来。

        function add() {var num = 0;return function () {num++;console.log('数字:', num);}}

        创建两个闭包的实例bibao3和bibbao4,每次调用add函数,每个闭包都会创建一个新的num变量(相当于开辟新的内存空间),bibao3和bibao4直接是相互独立的。

        既然调用函数是函数名称()的形式,为什么不能直接用函数名称()()访问闭包呢?

闭包的作用

        闭包可以保留变量的状态

        创建闭包时,会创建一个新的内存空间,都会开辟独立的内存空间,在闭包中的变量可以记住当前的状态,再次使用闭包时,闭包会保留之前的状态。

        在前面的案例中,每次bibao3()或者bibao4(),都会按照上一次的值进行自增。

        闭包可以让变量私有化

        每次创建一个新的闭包,就会开辟独立的内存空间,闭包的变量都是私有的。

        在前面的案例中,每次bibao3()或者bibao4(),bibao3()和bibao4()的num值是不相同的。

闭包的缺点

        闭包虽然在JavaScript中提供了强大的封装和数据保护能力,但也存在一些缺点。首先,由于闭包能够捕获并长期持有其创建时的作用域中的变量,这可能导致内存使用增加,尤其是在大量创建闭包的情况下,可能会引起内存泄漏。其次,闭包可能会形成难以追踪的循环引用,这会阻碍JavaScript垃圾回收机制的效率,从而影响程序的性能。此外,闭包的使用如果不当,会增加代码的复杂性,使得理解和维护变得更加困难。因此,开发者在使用闭包时需要谨慎,确保在不需要时及时释放引用,避免不必要的内存占用,并合理组织代码以提高可读性和可维护性。

相关文章:

JavaScript基础——闭包

闭包简介 闭包的作用 闭包可以保留变量的状态 闭包可以让变量私有化 闭包的缺点 闭包简介 在JavaScript中,重复声明同一个变量会导致变量冲突,在这个时候可以使用闭包创建独立的执行环境。 在JavaScript中,闭包是指封闭的执行环境&#xff…...

Linux基础入门---安装vmware

😀前言 本篇博文是关于Linux基础入门和vmwarel5.5下载,希望你能够喜欢。 🏠个人主页:晨犀主页 🧑个人简介:大家好,我是晨犀,希望我的文章可以帮助到大家,您的满意是我的动…...

用AppleScript点击无效,继续用pyautogui.click()

目标:点击下图中 CheckBox 元素 第一步:获取这个元素的位置,并打印出value,确认是开关是关的(value0)再继续 set targetbox to checkbox 1 of group 1 of scroll area 1 of scroll area 1 of group 1 of g…...

谈谈我用MemFire Cloud开发应用的这一两年

作为一个独立开发者,这两年我在应用开发的道路上经历了不少挑战和收获。而帮助我度过这些挑战、提高开发效率的“神器”之一,就是MemFire Cloud。如果你还没听说过这个工具,那么我今天就来和你分享一下我使用MemFire Cloud开发应用的经历&…...

AI安全-文生图

1 需求 2 接口 3 示例 大模型图像安全风险探析 - 先知社区 前言 文生图模型是一种新兴的人工智能技术,它通过对大规模文本数据的学习,能够生成逼真的图像。这种模型包含两个主要组件:一个文本编码器和一个图像生成器。 文本编码器接收文本输入,并将其转换为一种数字化的表示…...

Hibernate 使用详解

在现代的Java开发中,数据持久化是一个至关重要的环节。而在众多持久化框架中,Hibernate以其强大的功能和灵活性,成为了开发者们的首选工具。本文将详细介绍Hibernate的原理、实现过程以及其使用方法,希望能为广大开发者提供一些有…...

乐普医疗校招社招笔试/测评通关攻略、最新北森题库、可搜索答案

乐普医疗为什么要做笔试/测评? 笔试/测评是乐普医疗校招社招招聘流程中的必经环节,只有完成笔试/测评,候选人才有机会进入面试流程,同学们收到笔试测评通知后请尽快完成。我们给部分岗位安排了笔试,笔试的成绩对于面试官来说是很重要的参考依据,请同学们在笔试过程…...

uniapp在线下载安装包更新app

首先用getSystemInfo判断平台、 再通过json文件模拟接口 判断版本号是否一致 不一致则下载服务器apk进行更新 外加网络波动导致失败重新下载更新包 uni.getSystemInfo({success: function (e) {// #ifndef H5// 获取手机系统版本const system e.system.toLowerCase();const pl…...

Unity | AmplifyShaderEditor插件基础(第一集:简单了解ASE和初识)

前言 我本来老老实实的写着我的Shader,群里的小伙伴强烈建议我开始讲ASE,我只能说,我是一个听话的Up。 一、什么是ASE 全称AmplifyShaderEditor,是一个unity插件,存在于unity商城中,售价看他们心情。&am…...

Windows文件资源管理器未响应,磁盘状态正常,很可能是这个原因

最近使用电脑,老感觉性能吃力,就想着自己把一些自动和延迟启动的服务给关掉一些,结果不小心把Work Folders给关闭了。于是,文件资源管理器能正常打开窗口,但是去点击磁盘或者去打开近期访问文件夹,它就会一…...

良好的代码习惯

虽然我们大家都知道这个道理,但能长期坚持下来的并不多。 在多年的项目开发过程中,遇到了各型各色的程序员,有技术一流的,有速度一流的,当然也有bug不断的,但真正能做到养成良好代码习惯并不多&#xff0c…...

音乐生成模型应用

重磅推荐专栏: 《大模型AIGC》 《课程大纲》 《知识星球》 本专栏致力于探索和讨论当今最前沿的技术趋势和应用领域,包括但不限于ChatGPT和Stable Diffusion等。我们将深入研究大型模型的开发和应用,以及与之相关的人工智能生成内容(AIGC)技术。通过深入的技术解析和实践经…...

DBEUG:二维图尺寸没思路

问题 标注总是不对 解决 关注孔(螺纹 沉头 通孔 标注清楚)关注孔的定位(同心圆 靠边定位)0.02一定打开三维图 看装配关系过盈 还是 查公差表可以min max限制装配公差一定要有意义部分宽度变化大的加平行修改的rev改成1 方框1表…...

【图像去雾系列】使用SSR/MSR/MSRCR/MSRCP/automatedMSRCR算法对单图像进行图像增强,达到去雾效果

目录 一 图像去雾算法概述 二 SSR/MSR/MSRCR算法 三 实践 一 图像去雾算法概述 近些年来,出现了众多的单幅图像去雾算法,其主要可以分为 3 类:基于图像增强的去雾算法、基于图像复原的去雾算法和基于 CNN 的去雾算法。 ▲基于图像增强的去雾算法 通过图像增强技术突出图…...

oracle普通导出导入

原始的普通导出导入工具,是一个客户端工具。使用导出工具(export utility简称exp)是将数据从oracle数据库以二进制形式写入操作系统文件,这个文件存储在数据库之外,并且可以被另一个数据库使用导入工具(imp…...

如何将CSDN文章导出为pdf文件

第一步: 打开想要导出的页面,空白处点击鼠标右键⇒点击“检查”或“check”,或直接在页面按F12键。 第二步: 复制以下代码粘贴到控制台,并按回车。 若提示让输入“允许粘贴”或“allow pasting”,按提示…...

利用Python实现供应链管理中的线性规划与资源优化——手机生产计划1

目录 写在开头1. Python与线性规划的基础2.供应链管理中的资源优化3.利用Python进行供应链资源优化3.1 简单的优化实例3.2 考虑多种原材料3.3 多种原材料、交付时间与物流融合的情况 4.规范性分析在供应链管理中的应用价值写在最后 写在开头 在全球供应链日益复杂的背景下&…...

Spring Cloud全解析:配置中心之springCloudConfig分布式配置动态刷新

分布式配置动态刷新 当配置中心中的配置修改之后,客户端并不会进行动态的刷新,每次修改配置文件之后,都需要重启客户端,那么如何才能进行动态刷新呢 可以使用RefreshScope注解配合actuator端点进行手动刷新,不需要重…...

mac如何查看shell是 zsh还是bash

怎么确定mac使用的 shell类型 在终端中输入echo $0命令查看你所使用的 shell(默认使用的zsh) echo $0# 或者 echo $SHELL 如果是 bash 配置文件则为:~/.bash_profile 是 zsh,则配置文件为:~/.zshrc 如何更改默认 S…...

STM32cubeMX配置Systick的bug

STM32cubeMX版本:6.11.0 现象 STM32cubeMX配置Systick的时钟,不管选择不分频 还是8分频。 生成的代码都是一样的,代码都是不分频。 即不管选择不分频还是8分频,Systick都是使用的系统时钟 函数调用 HAL_Init() → HAL_Init…...

OpenLayers 可视化之热力图

注:当前使用的是 ol 5.3.0 版本,天地图使用的key请到天地图官网申请,并替换为自己的key 热力图(Heatmap)又叫热点图,是一种通过特殊高亮显示事物密度分布、变化趋势的数据可视化技术。采用颜色的深浅来显示…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间, 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点,不需要开启数据库闪回。…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

在四层代理中还原真实客户端ngx_stream_realip_module

一、模块原理与价值 PROXY Protocol 回溯 第三方负载均衡(如 HAProxy、AWS NLB、阿里 SLB)发起上游连接时,将真实客户端 IP/Port 写入 PROXY Protocol v1/v2 头。Stream 层接收到头部后,ngx_stream_realip_module 从中提取原始信息…...

使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台

🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...

Device Mapper 机制

Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析

Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在,通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战,比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

Git 3天2K星标:Datawhale 的 Happy-LLM 项目介绍(附教程)

引言 在人工智能飞速发展的今天,大语言模型(Large Language Models, LLMs)已成为技术领域的焦点。从智能写作到代码生成,LLM 的应用场景不断扩展,深刻改变了我们的工作和生活方式。然而,理解这些模型的内部…...