闭包解析,python和javascript结合理解(变量作用域,垃圾回收机制,内存管理)

闭包解析,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结束之前手动删除,减少内存的使用

https://www.cnblogs.com/duanlianjiang/p/5036671.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值