假设您在一个模块(即一个.psm1
文件)中定义了两个函数:
function f1{
param($x1)
$a1 = 10
f2 $x1
}
function f2{
param($x2)
$a2 = 100
& $x2
}
现在假设您运行以下命令:
PS C:\> $a0 = 1
PS C:\> $x0 = {$a0+$a1+$a2}
PS C:\> f1 $x0
1
$x2
尽管在内部调用,但仍保留命令行的上下文$f2
。如果您更改&
为.
.
在模块中替换$xn
为$xn.GetNewClosure()
然后调用会f1
捕获100
但 not的值10
:
PS C:\> f1 $x0
101
PS C:\> f1 $x0.GetNewClosure
101
.GetNewClosure()
发生这种情况是因为在内部调用f2
“覆盖”了$a1
捕获的值f1
。
有没有办法选择性地捕获脚本块中的变量?从这个例子开始,有没有办法同时捕捉$a1
内部f1
和$a2
内部f2
?
延伸阅读
PowerShell 作用域并不简单。考虑这个不完整的因素列表中的可能性:
- 任何时候都可以有全局和模块范围层次结构的任意组合
.
并且&
调用对范围的影响不同,- 管道提供的复杂流控制意味着不同或相同范围层次结构的多个范围
begin
、、process
和end
脚本块,甚至同一函数的多个调用可以同时处于活动状态
换句话说,PowerShell 作用域的工作描述抗拒简单性。