静态作用域与动态作用域
有如下一段scheme代码:
(define (f1 x) (f2 4)) (define (f2 y) (+ x y)) (f1 3)
若在一个为动态作用域的实现中,其结果是7,而在静态作用域的实现中,结果是错误.
动态作用域(dynamic scope)中,环境(environment)随着程序的运行而增长.这样的结果就是一个"变量"?(identifier)是否在环境中是否有值取决于它是否被执行过.
静态作用域(static scope),也叫词法作用域(lexical scope),词法是指"函数定义时的作用域",静态则是值"不随执行(调用)变化".一个变量是否有值则取决于1.它是否被绑定?2.如果绑定了.在哪个环境中?
大多数语言都使用静态作用域.如 Emacs Lisp,Common Lisp,Perl可使用动态作用域.
动态作用域的缺点比如阅读困难.结构控制复杂度的增加.
参考: