以下 PowerShell 代码显示了从闭包调用的函数的意外作用域行为。你能解释这是“设计”还是缺陷?
function runblock($block) {
$x = 4
& $block
}
function printx() {
" in printx: x=" + $x
}
"PSVersion $($PSVersionTable.PSVersion)"
$x = 1
$b = {"In block x=" + $x ; $x = 3 ; printx}
$x = 2
runblock $b
$x = 1
$b = {"In closure x=" + $x ; $x = 3 ; printx}.GetNewClosure()
$x = 2
runblock $b
上面的输出是
PSVersion 3.0
In block x=4
in printx: x=3
In closure x=1
in printx: x=4
大多数输出对我来说很有意义:
脚本块输出In block x=4
,因为它的父范围是runblock
函数。由于其父范围是脚本块范围,因此printx
函数输出。x=3
闭包输出In closure x=1
,因为 的值$x
被GetNewClosure
调用捕获。一切如预期。
printx
但是:来自闭包输出的调用in printx: x=4
。因此,在其中printx
执行的范围不受 where 闭包范围的影响$x = 3
。
我觉得奇怪的是,从普通脚本块调用的函数确实看到了脚本块范围内的变量,但从闭包调用的函数却看不到闭包中的变量。