静态绑定和动态绑定
在今年4月1日,Emacs24合并了lexbind分支,elisp终于也开始支持词法绑定(lexical binding,即静态绑定)了。其实词法绑定对于我们今天的人来说是再熟悉不过了,因为目前多数语言都是词法绑定,包括我们熟悉C、C++、Python、Java等等,这导致动态绑定(dynamic binding)现在看起来反而比较奇怪。
所谓绑定(binding)即变量在运行期的存在,即是变量名字和它的实际内存位置的映射关系。存在,是个时空概念,变量同样有它的作用域(scope)和生存期(extent)。对词法变量而已,它具有词法作用域和不确定的(indefinite)的生存期,这表示一个词法变量只能在一个函数或一个block内存在,它的绑定只在一段代码区域内有效,但从时间上来讲,它可以在任意的时间里持续存在,只是取决于该变量需要使用(reference)多久;而动态变量正好相反,它具有不确定的作用域,这表示一个动态变量可以在任意地方出现,只是取决于你在什么地方绑定它,同时它有着动态(dynamic)的生存期,这表示当绑定该变量的代码执行完毕,该绑定就失效了,也就意味着该变量失效了
...