我想我理解为什么在使用动态范围的语言中使用闭包是有危险的。也就是说,似乎您可以关闭变量OK,但是在尝试读取它时,您只会在全局堆栈的顶部获得该值。如果其他功能在此期间使用相同的名称,则可能很危险。
我还错过了其他一些细微之处吗?
最佳答案
是的,这是基本问题。但是,术语“closure”是“词法闭合”的缩写,即by definition captures its lexical scope。我会用动态范围化的语言将它们称为LAMBDA
。只要您不尝试返回Lambda,它们在动态范围内的语言中都是绝对安全的。
(对于一个有趣的思想实验,将在Emacs Lisp中返回动态范围的lambda的问题与在C中返回对堆栈分配的变量的引用的问题,以及在Scheme中这两个都是不可能的)。
很久以前,当动态范围的语言比今天少见的时候,这就是funargs problem。您提到的问题是向上的funargs问题。