js函数闭包解析

闭包是JavaScript中非常重要的概念,理解闭包对于编写高质量的代码是至关重要的。本文将详细解析闭包的概念,并提供一些代码示例来帮助读者更好地理解闭包的使用。

什么是闭包? 闭包是指在一个函数内部定义的函数,该函数可以访问包含它的父函数的变量。换句话说,闭包是一个函数和该函数所在的环境的组合体。

闭包的作用:

  1. 让外部函数的变量被内部函数使用,实现数据的封装和隐藏。
  2. 保护变量不被外部访问修改,实现私有化的效果。
  3. 延长变量的生命周期,使其在函数执行完毕后依然可以被访问。

闭包的实现: 闭包的实现需要满足两个条件:

  1. 内部函数必须引用外部函数的变量。
  2. 外部函数必须返回内部函数。

代码示例1:基本闭包

function outer() {
  var name = "John";
  function inner() {
    console.log(name);
  }
  return inner;
}

var fn = outer();
fn(); // 输出 "John"

在这个例子中,outer函数返回了一个内部函数inner。当我们调用outer函数时,它返回的是inner函数,我们将其赋值给fn变量。然后我们调用fn函数,它能够访问outer函数中的变量name,并将其输出。

代码示例2:闭包中的变量修改

function outer() {
  var count = 0;
  function inner() {
    count++;
    console.log(count);
  }
  return inner;
}

var fn1 = outer();
fn1(); // 输出 1
fn1(); // 输出 2

var fn2 = outer();
fn2(); // 输出 1

在这个例子中,outer函数返回的是一个内部函数inner,该函数可以修改外部函数中的变量count。我们使用两个不同的变量fn1fn2来存储不同的内部函数,它们分别属于不同的作用域,因此它们对应的count变量是互相独立的。

代码示例3:闭包中的循环问题

function outer() {
  var arr = [];
  for (let i = 0; i < 3; i++) {
    arr.push(function() {
      console.log(i);
    });
  }
  return arr;
}

var fnArr = outer();
fnArr[0](); // 输出 0
fnArr[1](); // 输出 1
fnArr[2](); // 输出 2

在这个例子中,outer函数返回了一个包含三个内部函数的数组。这些内部函数都引用了外部函数中的变量i。由于i是使用let关键字声明的,它具有块级作用域,因此每次循环都会创建一个新的i。这样,每个内部函数引用的i都是不同的,所以它们的输出结果也不同。

总结: 闭包是JavaScript中非常有用的概念,它可以让我们实现一些高级的功能,比如数据的封装和隐藏,变量的保护和延长变量的生命周期等。在使用闭包时,要注意变量的作用域和生命周期,以避免出现意想不到的问题。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

并发编程理论基础——面向对象与并发编程(十一)

简述 封装共享变量、识别共享变量间的约束条件、制定并发访问策略。 封装共享变量 将共享变量&#xff08;属性和方法&#xff09;作为对象属性封装在内部&#xff0c;对所有公共方法制定并发访问策略&#xff0c;也就是说外界对象只能通过目标对象提供的公共方法来间接访问这些…

《梦醒蝶飞:释放Excel函数与公式的力量》6.4 TODAY函数

第四节&#xff1a;6.4 TODAY函数 1&#xff09;TODAY函数概述 TODAY函数是Excel中一个非常有用的内置函数&#xff0c;它返回当前的日期。与NOW函数不同&#xff0c;TODAY函数仅返回日期部分&#xff0c;时间部分默认为午夜&#xff08;0:00&#xff09;。 2&#xff09;函…

使用 Python 注销、重启、关闭计算机

众所周知&#xff0c;Python 是一种功能强大的脚本语言。在本文中&#xff0c;将编写一个 Python 程序本控制计算机&#xff0c;实现计算机的注销、重启、关闭等操作。 Python 中的 os 模块&#xff0c;提供了一种与操作系统交互的方式&#xff0c;可以使用 os.system() 函数在…

中北大学算法课动态规划问题实验:题目1 数塔问题

目录 1.实验名称2.实验目的3.实验内容4.实验过程伪代码java代码 5.实验结论及心得代码运行截图心得 实验报告 1.实验名称 动态规划问题实验&#xff1a;题目1 数塔问题 2.实验目的 (1)掌握动态规划法的设计思想&#xff1b; (2)掌握数塔问题的具体实现过程&#xff1b; (3)熟…

移动UI:我的界面,竟然有这么设计方式,而且个个都简洁美观。

移动应用中的个人中心页面通常包含以下内容&#xff1a; 1. 用户头像和昵称&#xff1a;展示用户的头像和昵称&#xff0c;用于个人身份的展示和识别。 2. 个人资料&#xff1a;展示用户的个人信息&#xff0c;如姓名、性别、生日、联系方式等。用户可以在这里查看和编辑自己…

【MySQL】(基础篇十七) —— 存储过程

存储过程 本文将介绍什么是存储过程&#xff0c;为什么要使用存储过程以及如何使用存储过程&#xff0c;并且介绍创建和使用存储过程的基本语法。 MySQL的存储过程是预编译的SQL语句集合&#xff0c;它们作为一个可执行单元存储在数据库中。存储过程能够封装复杂的业务逻辑&a…

轻松驾驭文件重命名:一键实现文件名更改并高效复制新文件名,让文件管理变得简单高效

在信息爆炸的时代&#xff0c;我们的电脑中存储着成千上万的文件&#xff0c;这些文件或是珍贵的回忆&#xff0c;或是重要的工作资料。然而&#xff0c;随着时间的推移&#xff0c;我们可能需要对这些文件进行整理和管理&#xff0c;其中最常见的一项操作就是文件名的重命名。…

记一次对ouija渗透测试c语言逆向学习

概要 初始知识 web应用枚举 二进制逆向 文件枚举 堆栈溢出 学到知识 hash长度攻击 任意文件读取 二进制逆向分析 信息收集 端口扫描 nmap --min-rate 1000 -p- 10.129.30.104 发现22&#xff0c;80&#xff0c;3000端口 网站探测 目录枚举 feroxbuster -u http://10.1…

【JVM】Java虚拟机运行时数据分区介绍

JVM 分区&#xff08;运行时数据区域&#xff09; 文章目录 JVM 分区&#xff08;运行时数据区域&#xff09;前言1. 程序计数器2. Java 虚拟机栈3. 本地方法栈4. Java 堆5. 方法区6. 运行时常量池7. 直接内存 前言 之前在说多线程的时候&#xff0c;提到了JVM虚拟机的分区内存…

数值稳定性、模型初始化和激活函数

一、数值稳定性&#xff1a;神经网络很深的时候数据非常容易不稳定 1、神经网络梯度 h^(t-1)是t-1层的输出&#xff0c;也就是t层的输入&#xff0c;y是需要优化的目标函数&#xff0c;向量关于向量的倒数是一个矩阵。 2、问题&#xff1a;梯度爆炸、梯度消失 &#xff08;1&…

OpenAI“断供”对我们的影响之我见

1.新闻 OpenAI决定于7月关闭国内GPT访问 近日&#xff0c;美国人工智能公司OpenAI宣布&#xff0c;将于7月起关闭对中国内地的GPT访问&#xff0c;此举引发了业内广泛关注和讨论。以下是关于此新闻的具体信息&#xff1a; 关闭时间&#xff1a;OpenAI官方推送的邮件指出&…

Leaflet【五】Marker点闪烁效果

控制点的透明度 在创建marker的构造当中会传递一个配置对象&#xff0c;这个里面就可以配置对应的透明度opacity&#xff0c;那么只需要去修改这个透明度的值就好了。通过定时器去一直改值即可。 const changeOpacity (entity) > {let i 1;let int setInterval(() >…

谷歌发布两款新Gemma 2大语言模型;阿里云开源Qwen2-72B模型荣登榜首

&#x1f989; AI新闻 &#x1f680; 谷歌发布两款新Gemma 2大语言模型 摘要&#xff1a;谷歌发布Gemma 2大语言模型&#xff0c;包括90亿和270亿参数两种版本。Gemma 2在推理性能、效率和安全性上较第一代有显著提升。27B模型的性能媲美更大规模的主流模型&#xff0c;且部署…

【C++题解】1721. 输出个位为5或者个位为8数

问题&#xff1a;1721. 输出个位为5或者个位为8数 类型&#xff1a;简单循环 题目描述&#xff1a; 请从小到大输出 1∼n 中所有个位为 5 或者个位为8 的所有的整数&#xff0c;每行 1 个。 比如&#xff0c;假设 n20&#xff0c;那么满足条件的数输出如下&#xff1a; 5 8 1…

尊重·理解·协同:论团队合作中的认知提升与信誉建设

零、背景 为什么写博客&#xff1f; 给自己灌输大道理—唠叨哲学 定期总结&#xff1a;反思这段时间内的生活、学习或工作中的得失&#xff0c;提炼出具有普适性的经验和教训。 紧跟热点新闻来有点流量 独特视角&#xff1a;尽量优先进行——人云亦云&#xff0c;先学某一…

MQTT遗嘱信息(2)

接前一篇文章&#xff1a;MQTT遗嘱信息&#xff08;1&#xff09; 本文内容参考&#xff1a; 什么是MQTT遗嘱消息&#xff1f;如何配置和处理遗嘱消息&#xff1f;_mqtt last will-CSDN博客 MQTT 协议学习&#xff1a;Retained&#xff08;保留消息&#xff09; 与 LWT&#x…

Stream Lua Nginx Module 插件一键安装

文章目录 一、场景说明二、脚本职责三、参数说明四、操作示例五、注意事项 一、场景说明 本自动化脚本旨在为提高研发、测试、运维快速部署应用环境而编写。 脚本遵循拿来即用的原则快速完成 CentOS 系统各应用环境部署工作。 统一研发、测试、生产环境的部署模式、部署结构、…

Linux容器篇-Docker容器的使用

文章目录 前言一、Docker的安装主机环境准备关闭防火墙关闭selinux时间同步关闭 swap配置操作系统yum源配置国内Docker-ce镜像源注意 二、安装docker-ce三、配置镜像加速器阿里云镜像加速器生成 四、Docker的使用Docker 客户端获取镜像启动容器查看所有的容器&#xff1a;启动已…

内外网共享文件最优方案,了解一下

基于安全性、合规性、数据防泄漏等原因&#xff0c;为了保护核心数据&#xff0c;企业一般会做内外网隔离&#xff0c;隔离后仍存在数据交换共享的需求。数字化时代&#xff0c;数据的流通与共享成为企业和团队之间日常运营的关键环节。内外网共享文件是指在内网和外网之间共享…

【知识学习】阐述Unity3D中动画渲染的概念及使用方法示例

Unity3D中的卡通渲染&#xff08;Cartoon Rendering&#xff09;是一种渲染技术&#xff0c;它模仿传统手绘动画或漫画的视觉效果。这种渲染风格通常具有鲜明的颜色、清晰的轮廓线和简化的光影效果&#xff0c;常用于制作动画、游戏和其他视觉媒体。 卡通渲染的基本概念 轮廓…