当你为变量创建局部绑定时,该绑定仅在程序的有限区域内生效(see 局部变量)。本节将精确说明其含义。
每个局部绑定都有确定的 作用域(scope) 和 存在期(extent)。作用域(scope) 指的是该绑定在源代码文本中 哪些 位置可以被访问。存在期(Extent) 指的是在程序执行过程中,该绑定在哪些时刻存在。
由于历史原因,Emacs Lisp 存在两种方言,通过缓冲区局部变量 lexical-binding 进行选择。在现代 Emacs Lisp 方言中,局部绑定默认是词法绑定。
词法绑定(lexical binding) 具有 词法作用域(lexical scope),意味着对该变量的任何引用都必须在文本上位于绑定结构内部11。它同时具有 无限存在期(indefinite extent),意味着在某些情况下,通过名为 闭包(closures) 的对象,即使绑定结构已执行完毕,该绑定仍然可以继续存在。词法作用域通常也被称为 静态作用域(static scoping)。
局部绑定也可以是动态绑定:在旧版 Emacs Lisp 方言中一律如此,在现代方言中则作为可选方式。动态绑定(dynamic binding) 具有 动态作用域(dynamic scope),意味着程序的任何部分都有可能访问该变量绑定。它同时具有 动态存在期(dynamic extent),意味着该绑定仅在绑定结构(如 let 表达式的体)正在执行时才有效。
旧的仅支持动态绑定的 Emacs Lisp 方言,在缺少方言声明的 Lisp 文件中被加载或求值时,仍然是默认方言。最终,现代方言将会被设为默认。 所有 Lisp 文件都应当声明所使用的方言,以确保它们在未来仍能正常运行。
下面的小节将更详细地介绍词法绑定和动态绑定,以及如何在 Emacs Lisp 程序中启用词法绑定。