There are situations where you need to create a script block, save it into variable and then execute it once or multiple times. Simply said, [ScriptBlock] is just an anonymous function so if you do this:
$scriptBlock = { $someVar } & $scriptBlock
Then you will get someVar variable from the current scope or from the parent scope (dynamic scoping).
But what to do if you need to create a script block and keep intact all values of all variables? PowerShell 2.0 introduction method to get closure: ScriptBlock.GetNewClosure(). Simply said, GetNewClosure method causes that script block remembers the values that were passed in the first time.
Example without get closure
$var = 'First' $scriptblock = { Value: {0}' -f $var } & $scriptblock $var = 'Second' & $scriptblock
Output
Value: First Value: Second
Example with get closure
$var = 'First' $scriptblock = { Value: {0}' -f $var }.GetNewClosure() & $scriptblock $var = 'Second' & $scriptblock
Output
Value: First Value: First