PowerShell ScriptBlock не является лексическим закрытием, поскольку он не закрывается над переменными, на которые ссылается в среде объявления. Вместо этого он, как представляется, использует динамическую область и свободные переменные, которые связаны во время выполнения в выражении лямбда.
function Get-Block {
$b = "PowerShell"
$value = {"Hello $b"}
return $value
}
$block = Get-Block
& $block
# Hello
# PowerShell is not written as it is not defined in the scope
# in which the block was executed.
function foo {
$value = 5
function bar {
return $value
}
return bar
}
foo
# 5
# 5 is written $value existed during the evaluation of the bar function
# it is my understanding that a function is a named scriptblock
# which is also registered to function:
Вызов GetNewClosure() в ScriptBlock возвращает новый ScriptBlock, который закрывается над указанными переменными. Но это очень ограничено по объему и возможностям.
Что такое классификация ScriptBlock?