什么是词法作用域的简要介绍?
原文由 Subba Rao 发布,翻译遵循 CC BY-SA 4.0 许可协议
让我们尝试最短的定义:
词法作用域 定义了如何在嵌套函数中解析变量名: 内部函数包含父函数的作用域,即使父函数已经返回。
仅此而已!
原文由 Pierre Spring 发布,翻译遵循 CC BY-SA 4.0 许可协议
10 回答11.3k 阅读
5 回答4.9k 阅读✓ 已解决
4 回答3.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
3 回答2.2k 阅读✓ 已解决
2 回答2.7k 阅读✓ 已解决
我通过例子来理解它们。 :)
首先, _词法作用域_(也称为 _静态作用域_),采用类似 C 的语法:
每个内部级别都可以访问其外部级别。
还有另一种方式,称为 Lisp 的第一个实现使用的 _动态范围_,同样采用类似 C 的语法:
这里
fun
可以访问dummy1
或dummy2
中的x
,或者任何调用fun
并在其中声明x
的函数中的任何x
。将打印 5,
将打印 10。
第一个称为静态,因为它可以在编译时推导出,第二个称为动态,因为外部范围是动态的并且取决于函数的链式调用。
我发现静态范围更容易观察。大多数语言最终都采用了这种方式,即使是 Lisp(两者都可以,对吗?)。动态范围就像将所有变量的引用传递给被调用的函数。
作为为什么编译器不能推断出函数的外部动态范围的一个例子,考虑我们的最后一个例子。如果我们这样写:
调用链取决于运行时条件。如果是真的,那么调用链看起来像:
如果条件为假:
两种情况下
fun
的外部范围是调用者 _加上调用者的调用者等等_。顺便提一下,C 语言不允许嵌套函数,也不允许动态作用域。