闭包理解

有段时间没有写过闭包了,趁现在有空也重温下闭包吧~

闭包概念:

闭包是在另一个函数(称为父函数)中定义的函数,并且可以访问在父函数作用域中声明和定义的变量。
同一闭包的不同实例中引用的自由变量互相没有影响的。
 
说实话,闭包的使用不是很常用,可能在js使用得比较多,比如在回调、setTimeout或者给多个dom添加点击事件等场景吧。
 
不废话,直接写个闭包:
js:
function a(){function b(){console.log(2)} return b}
cc = a()
cc()

纯粹在浏览器手撸的哈~
从上面例子可看出:闭包有外部函数a,以及内部函数b,return的是b函数,打印出的结果是: 2
一个函数里包含一个函数,并返回该函数,这就是一个简单的闭包~
 
在举个例子:
def out_func():
     list1 = []
     def inner_func(n):
         list1.append(1)
         print(n, list1)

     return inner_func

cc = out_func()
cc('ff')
cc('ff')
cc('ff')
cc2 = out_func()
cc2('ffg')
cc2('ffg')

  

 

 输出的结果如上图~

比较好理解是,子函数可以访问父函数的变量,反之不行, 并且每个实例对象互不干扰。 
 
 
在举个例子:
def out():
    # a = 'xxxxx'
    print(a)
    def inner():
        print(a)
    return inner

cc = out()
cc()

 

上面的例子就是我不想在使用out()实例时打印a,想在调用时打印a,可从注释的地方能联想到我想说啥吧~
需要在实例化时不调用想实现的逻辑而在需要用时调用可以用到闭包
 
以上标了颜色的应该就是我概括闭包的意思哈~
 
我是这么短浅的理解的~~
 
扩展下:
# 单例模式
# 闭包使用
def Single(cls):
    print('xxxxx')
    instance = {}
    def inner(*args, **kwargs):
        if cls not in instance:
            instance[cls] = cls(*args, **kwargs)
        return instance[cls]
    return inner


@Single
class Test(object):
    pass

a1 = Test()
a2 = Test()
print(id(a1))
print(id(a2))

 输出:

 

 

单例和闭包的结合使用哈~~ 

 

  

 
 
 
posted @ 2021-06-28 16:16  fengzao  阅读(45)  评论(0编辑  收藏  举报