函数与环境

一个函数可能使用没有写在参数表里的外部名字。闭包让函数与这些名字所在的环境保持联系;它离开原来的定义位置后,仍能按语言规则取得相应绑定。这里保存的不是某一行文字的截图,而是执行函数所需的名字关系,具体由语言和运行时共同实现。

参考:[1]

构造不同的行为

可以让一个外层函数接收初始值,返回使用该值的内层函数。多次调用外层函数会建立不同环境,得到各自定制的函数。程序因此能够先确定一部分配置,再把余下的计算交给调用者;不必把所有配置都反复放进后续每一次调用的参数中。

参考:[2]

绑定不总是数值副本

若多个函数共享同一可变绑定,一个函数更新它,其他函数以后也可能读到改变。闭包因此不保证永远保存创建时的数值副本。循环中多个回调读到同一个最后值,常与绑定的共享方式有关;判断结果必须看变量在哪里建立,以及语言是否为每次迭代建立新绑定。

参考:[1]

局部状态的生命周期

闭包可以为计数器和回调保存局部状态,也可能让原本很大的对象因仍被引用而继续占用内存。隐藏名字并不自动形成安全隔离,保留环境也不等于保留整个调用栈。设计时需要区分可见性、共享与存活时间,才能知道哪些数据真正会跟随函数留下来。

参考:[2]