什么时候确定函数内函数的词法作用域?
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 = 3
和 g
存在于 f
的本地环境中。当执行g(x)
遇到自由变量z
时,R向上查找下一个环境,即调用环境,也就是f
的本地环境。它在那里找到 z
并继续,返回 7。然后将其添加到 x
,即 3.
(因为这个答案吸引了更多的关注,我应该补充一点,我的语言在谈论 x
"equals" 的各个方面有点松散,可能无法准确反映 R 的延迟评估参数。x
将 等于 3 一旦需要该值。)
我查看了 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 = 3
和 g
存在于 f
的本地环境中。当执行g(x)
遇到自由变量z
时,R向上查找下一个环境,即调用环境,也就是f
的本地环境。它在那里找到 z
并继续,返回 7。然后将其添加到 x
,即 3.
(因为这个答案吸引了更多的关注,我应该补充一点,我的语言在谈论 x
"equals" 的各个方面有点松散,可能无法准确反映 R 的延迟评估参数。x
将 等于 3 一旦需要该值。)