【什么是闭包? 闭包产生的原因? 闭包有哪些表现形式?】

2023-10-05 23:04

本文主要是介绍【什么是闭包? 闭包产生的原因? 闭包有哪些表现形式?】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JS闭包

  • 什么是闭包?
  • 闭包产生的原因?
  • 闭包有哪些表现形式?

什么是闭包?

闭包是指一个函数可以访问并操作在其作用域之外的变量的能力。在 JavaScript 中,每当函数被创建时,就会创建一个闭包。

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

function add(x) {return function(y) {return x + y;};
}const addThree = add(3);
console.log(addThree(5)); // 输出 8

在这个例子中,add 函数返回一个新的函数,新函数可以访问 add 函数的参数 xaddThree 是一个闭包,它存储了 add(3) 返回的函数以及 x 的值,因此调用 addThree(5) 就会返回 3 + 5 = 8

闭包在许多 JavaScript 库和框架中都得到了广泛的应用,它们可以用来实现许多高级功能,例如封装私有变量、延迟计算、事件监听和函数柯里化等。

闭包产生的原因?

闭包的产生原因是因为在函数内部定义的函数可以访问外部函数的变量和参数,即使外部函数已经执行完毕,内部函数仍然可以访问那些变量和参数。

下面是一个简单的例子:

function outerFunction() {var outerVariable = "Hello";function innerFunction() {console.log(outerVariable);}return innerFunction;
}var closure = outerFunction();
closure(); // 输出 "Hello"

在上面的代码中,outerFunction 定义了一个局部变量 outerVariable 和一个内部函数 innerFunction,并将 innerFunction 作为返回值返回。当 outerFunction 被调用时,它返回内部函数 innerFunction,然后 outerFunction 的执行结束。但是,innerFunction 仍然能够访问 outerVariable,并且在调用 closure() 时,它打印了 outerVariable 的值。这是由于 innerFunction 形成了一个闭包,将 outerVariable 保存在其内部作用域中,因此即使 outerFunction 已经执行完毕,innerFunction 仍然可以访问 outerVariable

闭包有哪些表现形式?

闭包有以下两种表现形式:

  1. 返回一个函数:当一个函数内部定义了另一个函数,并将这个内部函数作为返回值返回时,就形成了一个闭包。返回的这个函数可以访问外部函数中的变量,即使外部函数已经执行完毕并且其内部变量已经被销毁。

举例:

function outer() {var count = 0;function inner() {count++;console.log(count);}return inner;
}
var closure = outer();
closure(); // 输出1
closure(); // 输出2
closure(); // 输出3

在这个例子中,函数 outer 内部定义了一个函数 inner,并将其返回。变量 count 也定义在 outer 函数内部。
执行 outer 函数会返回函数 inner,将其赋值给变量 closure
然后调用 closure 函数,由于 closure 函数是由 outer 函数返回的 inner 函数,所以它可以访问 outer 函数内部的变量 count。因此每次调用 closure 函数都会输出一个累加的数值。

  1. 定义一个函数:在 JavaScript 中,通过定义一个函数并在该函数内部定义另一个函数,也可以形成一个闭包。这时需要将内部函数作为返回值返回,以便在外部调用。

举例:

function makeCounter() {var count = 0;function counter() {count++;console.log(count);}return counter;
}
var closure = makeCounter();
closure(); // 输出1
closure(); // 输出2
closure(); // 输出3

在这个例子中,函数 makeCounter 内部定义了函数 counter,并将其返回。变量 count 也定义在 makeCounter 函数内部。
执行 makeCounter 函数会返回函数 counter,将其赋值给变量 closure
然后调用 closure 函数,由于 closure 函数是由 makeCounter 函数返回的 counter 函数,所以它可以访问 makeCounter 函数内部的变量 count。因此每次调用 closure 函数都会输出一个累加的数值。

这篇关于【什么是闭包? 闭包产生的原因? 闭包有哪些表现形式?】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/152232

相关文章

IDEA编译报错“java: 常量字符串过长”的原因及解决方法

《IDEA编译报错“java:常量字符串过长”的原因及解决方法》今天在开发过程中,由于尝试将一个文件的Base64字符串设置为常量,结果导致IDEA编译的时候出现了如下报错java:常量字符串过长,... 目录一、问题描述二、问题原因2.1 理论角度2.2 源码角度三、解决方案解决方案①:StringBui

部署Vue项目到服务器后404错误的原因及解决方案

《部署Vue项目到服务器后404错误的原因及解决方案》文章介绍了Vue项目部署步骤以及404错误的解决方案,部署步骤包括构建项目、上传文件、配置Web服务器、重启Nginx和访问域名,404错误通常是... 目录一、vue项目部署步骤二、404错误原因及解决方案错误场景原因分析解决方案一、Vue项目部署步骤

pip install jupyterlab失败的原因问题及探索

《pipinstalljupyterlab失败的原因问题及探索》在学习Yolo模型时,尝试安装JupyterLab但遇到错误,错误提示缺少Rust和Cargo编译环境,因为pywinpty包需要它... 目录背景问题解决方案总结背景最近在学习Yolo模型,然后其中要下载jupyter(有点LSVmu像一个

SpringBoot中的404错误:原因、影响及解决策略

《SpringBoot中的404错误:原因、影响及解决策略》本文详细介绍了SpringBoot中404错误的出现原因、影响以及处理策略,404错误常见于URL路径错误、控制器配置问题、静态资源配置错误... 目录Spring Boot中的404错误:原因、影响及处理策略404错误的出现原因1. URL路径错

在Rust中要用Struct和Enum组织数据的原因解析

《在Rust中要用Struct和Enum组织数据的原因解析》在Rust中,Struct和Enum是组织数据的核心工具,Struct用于将相关字段封装为单一实体,便于管理和扩展,Enum用于明确定义所有... 目录为什么在Rust中要用Struct和Enum组织数据?一、使用struct组织数据:将相关字段绑

Linux内存泄露的原因排查和解决方案(内存管理方法)

《Linux内存泄露的原因排查和解决方案(内存管理方法)》文章主要介绍了运维团队在Linux处理LB服务内存暴涨、内存报警问题的过程,从发现问题、排查原因到制定解决方案,并从中学习了Linux内存管理... 目录一、问题二、排查过程三、解决方案四、内存管理方法1)linux内存寻址2)Linux分页机制3)

Vue项目中Element UI组件未注册的问题原因及解决方法

《Vue项目中ElementUI组件未注册的问题原因及解决方法》在Vue项目中使用ElementUI组件库时,开发者可能会遇到一些常见问题,例如组件未正确注册导致的警告或错误,本文将详细探讨这些问题... 目录引言一、问题背景1.1 错误信息分析1.2 问题原因二、解决方法2.1 全局引入 Element

MySQL不使用子查询的原因及优化案例

《MySQL不使用子查询的原因及优化案例》对于mysql,不推荐使用子查询,效率太差,执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,本文给大家... 目录不推荐使用子查询和JOIN的原因解决方案优化案例案例1:查询所有有库存的商品信息案例2:使用EX

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6