闭包解析,python和javascript结合理解
python的闭包在pythondaythree的16中有解释
1python中闭包概念和常用方法,闭包的意思是在使用内部函数前将外部函数的变量固定,以在使用内部函数时不会因外部函数释放而无法得到数值。闭包可以多次实例化,在这个多次实例化的使用就可以实现代码复用,比如定义直线,可以外部函数定义多条直线,一条便是一个实例化,再确定点的x坐标便可。闭包常犯的错误在变量定义上如
def foo():
a = 1
def bar():
a = a+ 1
return a
return bar
1
2
3
4
5
6
这个其实是解读代码的一个问题,涉及到变量域
变量的作用域决定了在哪一部分程序可以访问哪个特定的变量名称。
2Python的作用域一共有4种,分别是:
L (Local) 局部作用域
E (Enclosing) 闭包函数外的函数中
G (Global) 全局作用域
B (Built-in) 内置作用域(内置函数所在模块的范围)
以 L –> E –> G –>B 的规则查找,即:在局部找不到,便会去局部外的局部找(例如闭包),再找不到就会去全局找,再者去内置中找。
避免局部变量和全局变量在赋值时出现区分错误,当内部作用域想修改外部作用域的变量时,就要用到global和nonlocal关键字了。
这个例子就是先解释等号右边的 ,a发生计算a+1,应解释为局部变量,但这里没有a的定义值,所以会报错a未定义,违反先定义后使用如果使用global a 提前定义一下就不存在这个问题了
a = 10
def test(a):
a = a + 1
print(a)
test(a)
3js中闭包概念
闭包就是能够读取其他函数内部变量的函数,函数没有被释放,整条作用域链上的局部变量都将得到保留。
由于在javascript语言中,只有函数内部的子函数才能读取局部变量,因此可以把闭包简单理解成‘定义在一个函数内部的函数’。
所以,在本质上,闭包就是将函数内部和函数外部连接的一座桥梁。
js中变量作用域和python基本一致,但是有个地方要注意:
js中如果变量在函数内没有声明(没有使用 var 关键字),该变量为全局变量。
4JavaScript 变量生命周期在它声明时初始化。
局部变量在函数执行完毕后销毁。
全局变量在页面关闭后销毁。
5python中变量生命周期在它声明时初始化。局部变量在执行完函数后释放内存,销毁,全局变量有自动的内存销毁方式,
https://www.cnblogs.com/Xjng/p/5128269.html
对变量的内存进行计数,计数为0销毁
6总结一下,js和python的闭包概念是一致的,都是为了解决函数执行完,内部局部变量杯释放造成函数外无法调用该变量值的问题,为解决该问题,就在函数1内部放一个函数2,函数2存放函数1的变量,函数1返回函数2,这时便可以调用到局部变量了
但是这样做有个缺点,就是内存会被一直占用,需要我们在后面的程序中进行手动释放内存,而且要注意对不是用的局部变量要在函数1结束之前手动删除,减少内存的使用