闭包的理解?一般使用场景

news/2024/7/24 2:23:39 标签: 开发语言, javascript

是什么

一个函数和对其周围状态(词法环境)的引用捆绑在一起(函数被引用包围),这样的组合我们称之为闭包

也就是说,闭包让你可以在一个内层函数中访问到其外层函数的作用域

🍖在 JavaScript中,每当创建一个函数,闭包就会在函数创建的同时被创建出来,作为函数内部与外部连接起来的一座桥梁


示例:

javascript">function init(){
	var name = "Mozilla";
	function displayName(){
		alert(name);	
	}
	displayName();
}
init();

任何闭包的使用场景都离不开这两点:

  • 创建私有变量
  • 延长变量的生命周期

一般函数的词法环境在函数返回后就被销毁,但是闭包会保存对创建时所在词法环境的引用,即便创建时所在的执行上下文被销毁,但创建时所在词法环境依然存在,以达到延长变量的生命周期的目的。

例子:

javascript">function makeSizer(size){
	return function(){
		document.body.style.fontSize = size + 'px'	
	}
}
var size12 = makeSizer(12);
document.getElementById("size-12").onclick = size12;

柯里化函数

柯里化的目的在于避免频繁调用具有相同参数函数的同时,进行重用。

javascript">// 假设求长方形面积
function getArea(width,height){
	return width * height
}
const area1 = getArea(10,20)
// 如果宽老是10
const area2 = getArea(10,30)
//我们可以使用闭包柯里化这个计算面积的函数
function getArea(width){
	return height=>{
		return width * height
	}
}
const getTenWidthArea = getArea(10)
//  只要是宽度为10的长方形就可以这样计算
const area1 = getTenWidthArea(20)

使用闭包模拟私有方法

🍚🍚在JavaScript中,没有支持声明私有变量,但我们可以使用闭包来模拟私有方法

其他

例如计数器、延迟调用、回调等闭包的应用,其核心思想还是创建私有变量和延长变量的生命周期

注意事项

如果不是某些特定任务需要使用闭包,在其它函数中创建函数是不明智的,因为闭包在处理速度和内存消耗方面对脚本性能具有负面影响

例如,在创建新的对象或者类时,方法通常应该关联于对象的原型,而不是定义到对象的构造器中

原因在于每个对象的创建,方法都会被重新赋值
在这里插入图片描述
上面的代码中,我们并没有利用到闭包的好处,因此可以避免使用闭包。修改成如下

在这里插入图片描述


http://www.niftyadmin.cn/n/5133825.html

相关文章

搞定蓝牙-第六篇(HID

搞定蓝牙-第六篇(HID) ble与HIDHOGPGAPP与HID ESP32程序分析 ble与HID HOGP 我们发现,电脑连接了蓝牙键盘就可以直接使用了,不需要配置任何东西,那么,这两者是怎么通讯的呢。我们使用的电脑windows系统内…

Rust编程基础之变量与可变性

1.Rust变量 在Rust语言中, 变量默认是不可改变的(immutable), 这是Rust提供给我们的众多优势之一, 让我们可以充分利用Rust提供的安全性和简单并发性来编写代码。 当变量不可变时, 一旦值被绑定在一个名称上, 就不能改变这个值。下面是一段代码的例子: fn main() {let x 1;…

电子电器架构 —— 车载网关初入门(二)

我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 PS:小细节,本文字数5000+,详细描述了网关在车载框架中的具体性能设置。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 没有人关注你。也无需有人关注你。你必须承认自己的价值,你不能站在他…

LangChain+LLM实战---LangChain中的6大核心模块

模型(Models) LLMs 大型语言模型,将文本字符串作为输入,并返回文本字符串作为输出。 聊天模型 聊天模型通常由语言模型支持,但它们的API更加结构化。这些模型将聊天消息列表作为输入,并返回聊天消息。 文本…

MySQL Join 类型

文章目录 1 Join 类型有哪些2 Inner Join3 Left Join4 Right Join5 Full Join 1 Join 类型有哪些 SQL Join 类型的区别 Inner Join: 左,右表都有的数据Left Join: 左表返回所有的行, 右表没有的补充为 NULLRight Loin: 右表返回所有的行, 左表没有的补充为 NULLFull Outer J…

苍穹外卖-day04-套餐管理

1. 新增套餐 1.1 需求分析和设计 产品原型: 业务规则: 套餐名称唯一套餐必须属于某个分类套餐必须包含菜品名称、分类、价格、图片为必填项添加菜品窗口需要根据分类类型来展示菜品新增的套餐默认为停售状态 接口设计(共涉及到4个接口&am…

IOC课程整理-18 Spring注解

1. Spring 注解驱动编程发展历程 2. Spring 核心注解场景分类 3. Spring 注解编程模型 https://github.com/spring-projects/spring-framework/wiki/Spring-Annotation-Programming-Model 4. Spring 元注解(Meta-Annotations) 元注解(Meta-A…

不断改进 | YOLOv2算法超详细解析(包括诞生背景+论文解析+技术原理等)

前言:Hello大家好,我是小哥谈。YOLOv2是YOLO(You Only Look Once)目标检测算法的第二个版本,它在YOLOv1的基础上做了很多改进,包括使用更深的卷积神经网络Darknet-19作为特征提取器、使用Batch Normalizati…