名字与文本区域

程序中不同位置可以使用同样的名字,却不一定指向同一个变量。词法作用域根据名字被引入的文本区域及嵌套关系决定它的含义。内层使用一个名字时,系统按相应规则寻找可见绑定;变量名字的相似,不代表它们在整个程序里共享同一份存储。

参考:[1]

内层绑定的遮蔽

如果内层建立新的同名绑定,名字在这一范围内通常指向更近的绑定,外层绑定则被遮蔽。离开内层后,外层的使用仍按自身环境解释。Scheme把绑定区域写进语言规则;Python也规定局部、外层函数与全局名字的寻找方法,具体边界不能脱离各语言说明来猜测。

参考:[2]

调用位置不改定义环境

一个函数从别处被调用,并不必然改用调用者的局部变量。词法作用域让函数按照定义位置的相关绑定解释自由名字;闭包则帮助这些关系在运行中持续存在。动态作用域采用另一种查找思路,不能把它与动态类型混为一谈:前者讨论名字来源,后者讨论类型约束。

参考:[1]

作用域不等于存活时间

作用域说明程序哪些位置能够用一个名字,存活时间则说明相应数据在运行中保留多久。函数返回以后,外部未必还能直接书写其局部名字,但返回的闭包可能继续访问相关绑定。分清这两个问题,有助于理解封装、共享状态及内存为什么没有在某次函数返回时立即释放。

参考:[2]