静态和动态范围之间的相似之处

时间:2011-12-12 00:41:57

标签: scoping

静态和动态范围之间是否有任何相似之处?我几乎找不到任何东西。

2 个答案:

答案 0 :(得分: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#。

答案 1 :(得分:0)

据我所知,两者之间没有相似之处。他们之间的唯一区别就像上面解释的@Jules一样 在静态作用域中,名称是指其最接近的绑定,从程序文本中的内部范围到外部范围 在动态范围中,名称是指在运行时最接近的绑定。