在javascript中,有时候调用settimeout函数
function fetchData(url) {
setTimeout(function () {
console.log(`Fetching data from ${url}`);
}, 2000);
}
fetchData('https://api.example.com');
这里就是经常使用闭包,函数执行完毕但是变量生命周期还没有结束,因为回调函数还在使用,这里就是闭包,用于延长局部变量生命周期,可能由内存泄漏风险
python也一样:但是python闭包引用需要生命nonlocal才能使用,类似global
def outer(fn):
a = 0
def inner():
nonlocal a
a = a + 1
return a
return inner
a = outer(open)
print(a())
print(a())
print(a())
输出
1
2
3
在java中使用aop对方法进行增强,使用注解指示切入函数,python也有增强概念,使用装饰器,与注解类似,但是对增强的方法增加的方法使用闭包模式,参数为fn
def enhance(fn):
def inner(*args,**kwargs):
print("before test")
sum = fn(*args,**kwargs)
print(f"result is {sum}")
print("after test")
return inner
@enhance
def test(*args,**kwargs):
print(f"i am function test,args={args},kwargs={kwargs}")
sum = 0
for arg in args: sum += arg
for arg in kwargs.values(): sum += arg
return sum
if __name__ == '__main__':
test(1, 2,3,4,a=5,b=6,c=7,d=8)
before test
i am function test,args=(1, 2, 3, 4),kwargs={'a': 5, 'b': 6, 'c': 7, 'd': 8}
result is 36
after test
Process finished with exit code 0