我对闭包的理解

①闭包的定义:

在函数嵌套的前提下, 内部函数使用了外部函数的变量, 并且外部函数返回了内部函数, 我们把这个使用外部函数变量的内部函数成为闭包

②闭包的构成条件:

通过闭包的定义, 我们可以得知闭包的形成条件:

  1. 在函数嵌套(函数里面再定义函数)的前提下
  2. 内部函数使用了外部函数的变量(还包括外部函数的参数)
  3. 外部韩式返回了内部函数

③简单的闭包示例代码:

# 定义一个外部函数
def func_out(num1):
	# 定义一个内部函数
	def func_inner(num2):
		# 内部函数使用了外部函数的变量(num1)
		result = num1 + num2
		print(result)
	# 外部函数返回了内部函数, 这里返回的内部函数就是闭包
	return func_inner

# 创建闭包实例
f = func_out(1)
# 执行闭包
f(2)
f(3)

# 运行结果:
3
4
闭包执行结果的说明:

通过上面的输出结果可以看出闭包保存了外部函数内的变量num1,每次执行闭包都是在num1 = 1 基础上进行计算。

④闭包的作用:

闭包可以保存外部函数内的变量,不会随着外部函数调用完而销毁。

注意点:

由于闭包引用了外部函数的变量,则外部函数的变量没有及时释放,消耗内存。

⑤小结:

  1. 当返回的内部函数使用了外部函数的变量就形成了闭包
  2. 闭包可以对外部函数的变量进行保存
  3. 实现闭包的标准格式:
 # 外部函数
 def test1(a):
     b = 10
     # 内部函数
     def test2():
         # 内部函数使用了外部函数的变量或者参数
         print(a, b)
     # 返回内部函数, 这里返回的内部函数就是闭包实例
     return test2

⑥我对闭包的理解:

# 定义一个外部函数
def func_out(num1):
	# 定义一个内部函数
	def func_inner(num2):
		# 内部函数使用了外部函数的变量(num1)
		result = num1 + num2
		print(result)
	# 外部函数返回了内部函数, 这里返回的内部函数就是闭包
	return func_inner

# 创建闭包实例
f = func_out(1)
# 执行闭包
f(2)
f(3)

# 运行结果:
3
4

执行完f = func_out(1)后
f就接收了func_out()的返回值
此时f就等于是func_inner
f(2)就等于是func_inner(2)
装饰器也是同理

内容概要:本文档主要介绍了Intel Edge Peak (EP) 解决方案,涵盖从零到边缘高峰的软件配置和服务管理。EP解决方案旨在简化客户的入门门槛,提供一系列工具和服务,包括Edge Software Provisioner (ESP),用于构建和缓存操作系统镜像和软件栈;Device Management System (DMS),用于远程集群或本地集群管理;以及Autonomous Clustering for the Edge (ACE),用于自动化边缘集群的创建和管理。文档详细描述了从软件发布、设备制造、运输、安装到最终设备激活的全过程,并强调了在不同应用场景(如公共设施、工业厂房、海上油井和移动医院)下的具体部署步骤和技术细节。此外,文档还探讨了安全设备注册(FDO)、集群管理、密钥轮换和备份等关键操作。 适合人群:具备一定IT基础设施和边缘计算基础知识的技术人员,特别是负责边缘设备部署和管理的系统集成商和运维人员。 使用场景及目标:①帮助系统集成商和客户简化边缘设备的初始配置和后续管理;②确保设备在不同网络环境下的安全启动和注册;③支持大规模边缘设备的自动化集群管理和应用程序编排;④提供详细的密钥管理和集群维护指南,确保系统的长期稳定运行。 其他说明:本文档是详细描述了Edge Peak技术及其应用案例。文档不仅提供了技术实现的指导,还涵盖了策略配置、安全性和扩展性的考虑,帮助用户全面理解和实施Intel的边缘计算解决方案。
### 闭包的概念 闭包是指一个函数与其词法环境的绑定,这种绑定使得该函数可以在其创建之后仍然能够访问到定义时所处的作用域内的变量[^1]。当内部函数作为返回值从外部函数中返回时,即使外部函数已经完成执行,内部函数依然可以访问外部函数中的局部变量。 #### 词法作用域 JavaScript采用的是静态(或称为词法)作用域规则,在编写代码的时候就已经决定了变量的作用范围。这意味着子函数会记住并持有对外部父级函数环境中声明的所有变量的引用关系,无论这些子函数在哪里被执行[^2]。 ### 工作机制 每当创建一个新的函数时,默认情况下都会形成一个指向当前上下文环境的新链表节点,并将其附加给新函数的对象属性[[Scope]]上。这个过程发生在编译阶段而非运行期。因此,一旦某个内嵌函数被保存下来供以后调用——例如赋值给了全局命名空间下的变量或是传递到了其他地方,则它携带了自己的私有副本连同整个链条上的所有外层作用域一起保留了下来[^3]。 ```javascript function createCounter() { let count = 0; function counter() { count += 1; console.log(`Count is now ${count}`); } return counter; // 返回内部函数counter() } const myCounter = createCounter(); myCounter(); // 输出 "Count is now 1" myCounter(); // 输出 "Count is now 2" ``` 在这个例子中,`createCounter()` 函数创建了一个名为 `counter` 的内部函数,并且将此内部函数作为一个整体与当时存在的任何自由变量(这里是 `count` 变量)关联起来形成了闭包。每次调用 `myCounter()` 实际上调用了之前由 `createCounter()` 构建的那个特定版本的 `counter` 函数实例及其对应的封闭状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值