概念
闭包是由函数及其相关引用环境组合而成的实体,一般通过在匿名函数中引用外部函数的局部变量或者全局变量构成。
闭包=函数+引用环境
如果函数返回的闭包引用了该函数的局部变量:
- 多次调用该函数,返回的多个闭包所引用的外部变量是多个副本,原因是每次调用函数都会为局部变量分配内存
- 用一个闭包函数多次,如果该闭包修改了其引用的外部变量,则每一次调用该闭包对该外部变量都有影响,因为闭包函数共享外部引用。
如果函数返回的闭包引用的是全局变量a,则多次调用该函数返回的多个闭包引用的都是同一个a。同理,调用一个闭包多次引用的也是同一个a。此时,如果闭包中修改了a值得逻辑,则每次闭包调用都会影响全局变量a的值。使用闭包是为了减少全局变量,所以闭包引用全局变量是非常不好的编程方式。
闭包的价值
闭包最初的目的是减少全局变量,在函数调用的过程中隐式地传递共享变量,有其有用的一面:但是这种隐秘的共享变量的方式带来的坏处是不够直接,不够清晰,除非是非常有价值的地方,一般不建议使用闭包。
对象是富有行为的数据,而闭包是附有数据的行为,类在定义时已经显示地集中定义了行为,但是闭包中的数据没有显示地集中声明的地方,这种数据和行为耦合的模型不是一种推荐的编程模型,闭包是一种锦上添花的编程方式,不是不可缺少的。