闭包是什么
一,闭包
1.闭包的介绍
-
函数调用完,函数内定义的变量都会被销毁,但有时候我们需要保存函数内的这个变量,每次在这个变量的基础上完成一系列的操作
-
闭包的定义:
- 在函数的嵌套下,内部函数使用了外部函数的变量,并且外部函数返回了内部函数,那么这个使用外部函数变量的内部函数称为闭包
2.闭包的构成条件
- 在函数嵌套的前提下
- 内部函数使用了外部函数的变量、参数
- 外部函数返回了内部函数
3.闭包示例
# 定义一个外部函数
def func_out():
a = 1
# 定义一个内部函数
def func_inner(b):
sum = a + b
print("结果是:", sum)
return func_inner
# 获取闭包对象,这里的new_func就是func_inner,也就是闭包
new_func = func_out()
# 执行闭包
new_func(1)
new_func(2)
4.闭包的作用
1.保护作用
- 在这个上下文中会有一些私有的变量AO(xx),这些私有的变量和外界的变量不会冲突(互不影响)
- 应用
- 1.团队协作开发中 A/B共同开发一个页面,最后要把代码合并在一起,为了防止全局变量的冲突污染,简易每个开发者,都把自己的代码放置在一个闭包中,(自执行函数执行即可,这样就是私有上下文)保护起来
- 2.封装一个插件或者类库等,为了防止我们定义的变量和方法与用户定义的冲突,我们也是需要把所有写的代码放在一个闭包中
2.保存作用
- 某些情况下,上下文那种的某些内容被外界占用后,当前上下文并不会出钱销毁,这样就会把上下文中的一些信息储存起来
- 应用
- 1.在某些需求中,我们经常需要形成一个闭包,存储一些值(而且不能销毁),这样来供后面的程序运行使用
二,闭包的使用
用闭包实现两个人的对话:
1. 实现步骤
- 定义外部函数接收不同的人名信息
- 定义内部函数接收对话信息
- 在内部函数里面把人名和说话内容拼接显示
2.代码实现
def out(name):
def inner(content):
print(name + ':' + content)
return inner
a = out("张三")
b = out("李四")
a("在干嘛?")
b("没干嘛")
a("出去玩吗?")
b("去哪啊")
闭包还可以提高代码的可重用性,不需要再手动定义额外功能的函数
闭包的优缺点
-
优点
- 1:变量长期驻扎在内存中;
- 2:避免全局变量的污染;‘
- 3:私有成员的存在 ;
-
缺点
- 常驻内存 会增大内存的使用量 使用不当会造成内存泄露
- (1)由于闭包会使得函数中的变量都被保存在内存中,内存消耗很大,所以不能滥用闭包,否则会造成网页的性能问题,在IE中可能导致内存泄露。解决方法是,在退出函数之前,将不使用的局部变量全部删除。
- (2)闭包会在父函数外部,改变父函数内部变量的值。所以,如果你把父函数当作对象(object)使用,把闭包当作它的公用方法(Public Method),把内部变量当作它的私有属性(private value),这时一定要小心,不要随便改变父函数内部变量的值