闭包(常见)

在JavaScript中,闭包(Closure)是一个非常重要的概念,它指的是那些能够访问自由变量的函数。自由变量是指在函数中使用的,但既不是函数参数也不是函数的局部变量的变量。

闭包的构成条件

  1. 函数作为返回值:一个函数需要在其外部返回另一个函数,使得这个被返回的函数可以记住并访问它这个作用域中的变量。

  2. 函数作为参数传递:一个函数需要作为参数被传递到另一个函数中,并且在这个过程中它能访问到外部函数的变量。

  3. 函数作为对象属性:一个函数作为另一个对象的属性或者方法存在,能够访问到这个对象的属性。

闭包的特点

  1. 访问自由变量:闭包可以访问创建它的函数作用域内的变量,即使创建它的函数已经退出。

  2. 延迟执行:闭包可以使得代码在某个作用域之外执行,但仍然能够访问该作用域内的变量。

  3. 数据私有化:闭包可以用于创建私有变量,这些变量只能在闭包内部被访问和修改。

闭包的应用场景

  1. 创建私有变量:使用闭包可以模拟私有成员,因为闭包内的函数可以访问外层函数的局部变量。

  2. 函数记忆:闭包可以记忆每次调用的状态,常用于需要记忆某些状态的场景,如计数器。

  3. 模块化:闭包可以用于创建模块,封装模块内的变量和函数,避免污染全局作用域。

示例

 

function createCounter() { let count = 0; // 这是一个自由变量 return function() { count += 1; // 闭包可以访问并修改自由变量 return count; }; } let counter = createCounter(); console.log(counter()); // 输出 1 console.log(counter()); // 输出 2

在这个例子中,createCounter 函数返回了一个闭包。闭包可以记住并访问 createCounter 函数中的局部变量 count

注意事项

通过注意这些要点,你可以避免在循环中使用闭包时常见的陷阱,并确保代码按预期工作。

  1. 内存泄漏:由于闭包会持有外部变量的作用域,如果不正确使用,可能会导致内存泄漏。

  2. 性能问题:在一些情况下,频繁创建闭包可能会导致性能问题。

  3. 变量污染:在一些极端情况下,闭包可能会造成全局变量的污染。

  4. 在循环中使用闭包

  5. 在循环中使用闭包时,需要注意以下几个要点:

  6. 循环变量的捕获: 在循环中创建闭包时,每个由循环生成的函数都会捕获相同的循环变量。这意味着,如果你期望每个闭包引用循环中的不同迭代值,这可能不会如预期工作。因为所有闭包共享同一个上下文,所以它们可能都会引用循环的最终值。

     

    for (var i = 1; i <= 5; i++) { setTimeout(function() { console.log(i); // 所有这些将输出 6,因为它们共享同一个变量 i }, 1000); }

  7. 使用立即调用的箭头函数: 在ES6中,箭头函数没有自己的thisarguments,它们会捕获其所在上下文的这些值。因此,使用箭头函数可以避免传统函数表达式中遇到的问题。

     

    for (let i = 1; i <= 5; i++) { setTimeout(() => { console.log(i); // 这将按预期输出 1 到 5 }, i * 1000); }

  8. 使用立即调用的函数表达式(IIFE): 通过在循环中使用IIFE(Immediately Invoked Function Expression),你可以为每个迭代创建一个新的作用域,从而为每个闭包捕获一个唯一的变量副本。

     

    for (var i = 1; i <= 5; i++) { (function(i) { setTimeout(function() { console.log(i); // 正确输出当前迭代的 i 值 }, i * 1000); })(i); }

  9. 变量声明: 使用let(块级作用域)代替var(函数作用域)可以确保每次循环迭代都创建一个新的变量,从而允许闭包正确地捕获每个迭代的值。

  10. 内存和性能: 在循环中创建大量闭包可能会消耗更多内存,并可能影响性能。确保这是实现你目标的最佳方式,并且考虑到闭包对垃圾回收的影响。

  11. 异步事件处理: 如果你在循环中使用闭包来处理异步事件(如setTimeout或事件监听器),确保理解事件处理的顺序和闭包如何影响这些事件。

  12. 理解闭包的作用: 在循环中使用闭包时,要清楚闭包是如何工作的,以及它们是如何捕获并共享外部变量的。

理解闭包对于编写高质量的JavaScript代码非常重要,它有助于我们更好地管理状态和封装代码。

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

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

相关文章

西藏自治区建设工程系列职称评价标准

西藏自治区建设工程系列职称评价标准评审要求关于印发《西藏自治区建设工程系列职称评价标准&#xff08;试行&#xff09;》&#xff08;修订稿&#xff09;的通知评审通知关于开展2023年度西藏自治区建设工程系列高级工程师职称评审申报工作的通知类别基本条件业绩成果备注工…

Day05-JavaWeb开发-请求响应(postman工具/参数/案例)分层解耦(三层架构/IOC-DI引入)

1. 请求响应 1.1 概述 1.2 请求-postman工具 1.3 请求-简单参数&实体参数 1.3.1 简单参数 1.3.2 实体参数 1.4 请求-数组集合参数 1.5 请求-日期参数&json参数 1.6 请求-路径参数 1.7 响应-ResponseBody 1.8 响应-案例 2. 分层解耦 2.1 三层架构 2.2 分层解耦(IOC-D…

流畅的python-学习笔记_序列

概念 抽象基类&#xff1a;ABC, Abstract Base Class&#xff0c;ABC还有一个概念&#xff0c;是一个编程语言 序列 内置序列类型 分类 可分为容器类型和扁平类型 容器类型有list&#xff0c; tuple&#xff0c; collections.deque等&#xff0c;存储元素类型可不同&…

实验九 Java 语言网络通信程序设计练习(课内实验)

一、实验目的 本次实验的主要目的是练习网络通信程序的设计方法&#xff0c;并掌握计算机网络基 础知识、Java语言网络通信程序类库的结构和使用方法。 二、实验要求 1. 认真阅读实验内容&#xff0c;完成实验内容所设的题目。 2. 能够应用多种编辑环境编写Java语言源程序…

南京观海微电子---电源,从微观角度观看电功率是怎么产生

从微观角度看看无功功率是怎么产生的&#xff0c;在此之前&#xff0c;我们得先知道引起无功功率的元器件是储能器件&#xff0c;主要是电感和电容。 首先&#xff0c;在宏观上&#xff0c;我们知道电感能导致电压超前电流90&#xff0c;可从如下公式推出&#xff1a; 由此可以…

强到离谱!AI绘画Stable Diffusion让商业换装如此简单!AI一键换装,AI绘画教程

今天给大家介绍一款可以让 Stable Diffusion 轻松实现AI一键换装的超强插件—— Inpaint Anything &#xff0c;它能精准地替换图片中的指定部位&#xff0c;不仅上手简单&#xff0c;而且简直强到离谱&#xff01; 首先&#xff0c;我们要下载这个插件。插件可看文末扫描获取…

【ARM Cortex-M3指南】7:嵌套向量中断控制器和中断控制

文章目录 七、嵌套向量中断控制器和中断控制7.1 嵌套向量中断控制器概述7.2 基本的中断配置7.2.1 中断使能和清除使能7.2.2 中断设置挂起和清除挂起7.2.3 优先级7.2.4 活跃状态7.2.5 PRIMASK和FAULTMASK特殊寄存器7.2.6 BASEPRI特殊寄存器7.2.7 其他异常的配置寄存器 7.3 设置中…

LSTM计算指示图

掌握网络结构组件构成 输入门、遗忘门、输出门候选记忆细胞记忆细胞隐藏状态ref&#xff1a;6.8. 长短期记忆&#xff08;LSTM&#xff09; — 《动手学深度学习》 文档 (gluon.ai)

【论文阅读笔记】Order Matters(AAAI 20)

个人博客地址 注&#xff1a;部分内容参考自GPT生成的内容 论文笔记&#xff1a;Order Matters&#xff08;AAAI 20&#xff09; 用于二进制代码相似性检测的语义感知神经网络 论文:《Order Matters: Semantic-Aware Neural Networks for Binary Code Similarity Detection》…

一分钱不花从HTTP升级到HTTPS

HTTP升级到HTTPS是一个涉及安全性和技术实施的过程&#xff0c;主要目的是为了提升网站数据传输的安全性&#xff0c;防止数据被窃取或篡改。以下是一些关于从HTTP升级到HTTPS的技术性要点和步骤概述&#xff0c;结合上述信息资源&#xff1a; 一、理解HTTPS的重要性 HTTPS (…

nodejs postgresql

pgsql.js const { Client } require(pg); const config {host: "127.0.0.1",database: "postgres",user: "postgres",password: "postgres",port: 5432, // 默认的PostgreSQL端口号 }const pg require("pg"); const poo…

IDEA--debug

1. 单点调试的三个级别 Step into&#xff1a;在单步执行时&#xff0c;遇到子函数就进入并且继续单步执行。Step over&#xff1a;在单步执行时&#xff0c;在函数内遇到子函数时不会进入子函数内单步执行&#xff0c;而是将子函数整个执行完再停止&#xff0c;也就是把子函数…

[图解]SysML和EA建模住宅安全系统-01

1 00:00:00,980 --> 00:00:03,100 接下来&#xff0c;我们来看一下案例 2 00:00:04,930 --> 00:00:06,750 我们这次课程的案例 3 00:00:07,090 --> 00:00:13,800 选用了SysML实用指南的书上 4 00:00:13,810 --> 00:00:16,180 第十七章这个案例 5 00:00:16,350 …

Lib city笔记:TrajectoryDataset

1 AbstractDataset 抽象类&#xff0c;所有数据集的基类 2 TrajectoryDataset 2.1 __init__ 2.2 get_data 2.3 cutter_filter 2.3.1 按照时间间隔切割 2.3.2 按照同一天切割 2.3.3 按照固定窗口长度切割 2.4 get_encoder 2.5 encode_traj 2.6 divid_data 把数据集划分成训练…

DBCHM 数据库 CHM 文档生成工具

介绍 DBCHM 是一款数据库文档生成工具&#xff01; 该工具从最初支持chm文档格式开始&#xff0c;通过开源&#xff0c;集思广益&#xff0c;不断改进&#xff0c;又陆续支持word、excel、pdf、html、xml、markdown等文档格式的导出。 支持的数据库 SqlServerMySQLOraclePos…

最佳WordPress外贸主题推荐(2024)

WordPress是一个非常受欢迎的建站平台&#xff0c;它具有易用性&#xff0c;并提供了许多功能强大的主题和插件。如果你计划建立一个外贸独立站商城&#xff0c;选择一个适合的WordPress外贸主题至关重要。以下是一些外贸主题应具备的特点&#xff1a; 1. 欧美风格&#xff1a…

Higgins指数-企业可持续发展指数数据集(1990-2022年)

01、数据介绍 Higgins指数是一个企业可持续发展指数&#xff0c;旨在评估企业的环境和社会责任表现。该指数由可持续服装联盟&#xff08;SAC&#xff09;推出&#xff0c;是一个行业性的工具&#xff0c;旨在帮助服装和鞋类企业评估其产品和生产过程对环境和社会的影响。 本…

LabVIEW鸡蛋品质智能分级系统

LabVIEW鸡蛋品质智能分级系统 随着现代农业技术的飞速发展&#xff0c;精确、高效的农产品质量控制已成为行业的重要需求。其中&#xff0c;鸡蛋作为日常膳食中不可或缺的重要组成部分&#xff0c;其品质直接关系到消费者的健康与满意度。本文设计并实现了一套基于LabVIEW的鸡…

CMakeLists.txt语法规则:提供信息的变量说明一

一. 简介 前面几篇文章学习了 CMakeLists.txt语法中 部分常用命令。 接下来学习CMakeLists.txt语法中部分常用变量&#xff0c;变量也是 cmake 中的一个重头戏&#xff0c;cmake 提供了很多内置变量。每一个变量都有它自己的含义&#xff0c;可以通过如下链接地址查询到所有…

CAPM模型代码

CAPM模型是一种使用股票收益率和市场收益率之间的关系来估计资产预期收益率的模型。下面是一个简单的CAPM模型的Python代码示例&#xff1a; python import numpy as np def capm_model(stock_returns, market_returns, risk_free_rate): # 计算股票超额收益率 exces…