静态和动态范围界定之间有什么相似之处吗?我几乎找不到任何东西。
问问题
2421 次
2 回答
0
静态作用域或词法作用域意味着可以通过查看周围的作用域来确定声明变量的位置。动态范围意味着通过查找调用堆栈动态确定变量的声明位置。例如:
var x = 2;
function foo(){
return x;
}
function bar(...){
var x = 3;
print(foo());
}
bar();
使用静态或词法作用域,这将打印 2。 foo 内部的 x 来自周围的作用域。使用动态范围,这将打印 3,因为 x 的值是通过在调用堆栈中查找 bar 函数调用来确定的。此时定义了一个 x,因此使用值 x=3。
早期的 Lisps 对所有变量都使用了动态作用域,但这已被广泛认为是一个错误。后来的 Lisps 和大多数其他语言都使用词法作用域。一些语言,如 Common Lisp,确实提供了特殊的动态范围变量。C# 和 Java 等主流语言也有有限的动态范围:异常处理程序通常是动态范围的;如果引发异常,则调用的异常处理程序将在堆栈上动态查找,而不是由代码结构静态确定。例如:
try {
function foo(){
throw new Exception();
}
} catch (Exception e){ print "A"; }
try {
foo();
} catch (Exception e){ print "B"; }
此代码将打印“B”,而不是“A”。请注意,您需要使用 lambda 表达式在例如 C# 中编写此代码。
于 2011-12-12T00:49:54.990 回答
0
据我所知,两者之间没有相似之处。它们之间的唯一区别就像上面解释的@Jules 在静态作用域中,名称指的是其最接近的绑定,在程序文本中从内部到外部范围在动态作用域中,名称指的是它在运行时最接近的绑定。
于 2013-05-16T02:26:01.110 回答