什么时候确定函数内函数的词法作用域?

When is Lexical Scope for a function within a function determined?

我查看了 R 中的其他词法范围问题,但找不到答案。考虑这段代码:

f <- function(x) {
  g <- function(y) {
    y + z
  }
  z <- 4
  x + g(x)
}
f(3)

f(3) 会 return 回答 10。我的问题是为什么?在代码中定义 g() 时,z 尚未分配任何值。 g() 的闭包是在什么时候创建的?它 "look ahead" 到函数体的其余部分吗?它是在评估 g(x) 时创建的吗?如果是,为什么?

f 为 运行 时,首先发生的事情是在 f 的本地环境中创建函数 g。接下来,通过赋值创建变量 z

最后将x加到g(x)的结果上返回。在调用 g(x) 时,x = 3g 存在于 f 的本地环境中。当执行g(x)遇到自由变量z时,R向上查找下一个环境,即调用环境,也就是f的本地环境。它在那里找到 z 并继续,返回 7。然后将其添加到 x,即 3.

(因为这个答案吸引了更多的关注,我应该补充一点,我的语言在谈论 x "equals" 的各个方面有点松散,可能无法准确反映 R 的延迟评估参数。x 等于 3 一旦需要该值。)