什么是词法作用域?

新手上路,请多包涵

什么是词法作用域的简要介绍?

原文由 Subba Rao 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 291
2 个回答

我通过例子来理解它们。 :)

首先, _词法作用域_(也称为 _静态作用域_),采用类似 C 的语法:

 void fun()
 {
 int x = 5;

 void fun2()
 {
 printf("%d", x);
 }
 }

每个内部级别都可以访问其外部级别。

还有另一种方式,称为 Lisp 的第一个实现使用的 _动态范围_,同样采用类似 C 的语法:

 void fun()
 {
 printf("%d", x);
 }

 void dummy1()
 {
 int x = 5;

 fun();
 }

 void dummy2()
 {
 int x = 10;

 fun();
 }

这里 fun 可以访问 dummy1dummy2 中的 x ,或者任何调用 fun 并在其中声明 x 的函数中的任何 x

 dummy1();

将打印 5,

 dummy2();

将打印 10。

第一个称为静态,因为它可以在编译时推导出,第二个称为动态,因为外部范围是动态的并且取决于函数的链式调用。

我发现静态范围更容易观察。大多数语言最终都采用了这种方式,即使是 Lisp(两者都可以,对吗?)。动态范围就像将所有变量的引用传递给被调用的函数。

作为为什么编译器不能推断出函数的外部动态范围的一个例子,考虑我们的最后一个例子。如果我们这样写:

 if(/* some condition */)
 dummy1();
 else
 dummy2();

调用链取决于运行时条件。如果是真的,那么调用链看起来像:

 dummy1 --> fun()

如果条件为假:

 dummy2 --> fun()

两种情况下 fun 的外部范围是调用者 _加上调用者的调用者等等_。

顺便提一下,C 语言不允许嵌套函数,也不允许动态作用域。

原文由 Khaled Alshaya 发布,翻译遵循 CC BY-SA 4.0 许可协议

让我们尝试最短的定义:

词法作用域 定义了如何在嵌套函数中解析变量名: 内部函数包含父函数的作用域,即使父函数已经返回

仅此而已!

原文由 Pierre Spring 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题