You cannot depend on your eyes when your imagination is out of focus. - Mark Twain
I am a big fan of PowerShell, this is a rare occasion that Microsoft gets something right. If you want to learn more about PowerShell I suggest you buy this really great book or follow this blog. I thought I would start a series that outline some interesting and wonderful things I find about the language.
Today one of my colleges at work asked a very wonderful question about scopes, which left me puzzled (he is a JavaScript guru so I didn't understand why he didn't get it ;)
If you read through the official documentation about scopes you might get a bit confused like I did.
Local:
The current scope. The local scope can be the global
scope or any other scope. -- Hmmm
As we can see from the documentation PowerShell does not mention a concept of function scope like in JavaScript. If we take the JavaScript example and turn it into PowerShell we might get a surprise
$sport = "baseball"
$player = $null
function Get-Player() {
if ($sport -eq "baseball") {
$player = "Evan Longoria"; # (the baseball player)
}
else {
$player = "Eva Longoria"; # (the actress)
}
$player2 = "Derek Jeter";
return $player;
}
Get-Player
Write-Host $player
The $player variable is still $null. Not what I expected. However if we define a function within a function then the variable is available in the inner scope.
$sport = "baseball"
$player = $null
function Get-Player() {
if ($sport -eq "baseball") {
$player = "Evan Longoria"; # (the baseball player)
}
else {
$player = "Eva Longoria"; # (the actress)
}
$player2 = "Derek Jeter";
function Inner-Function {
Write-Host $player
Write-Host $player2
}
Inner-Function
return $player;
}
Get-Player
If we prefix the $player2 variable with $script it is now in scope.
$sport = "baseball"
$player = $null
function Get-Player() {
if ($sport -eq "baseball") {
$player = "Evan Longoria"; # (the baseball player)
}
else {
$player = "Eva Longoria"; # (the actress)
}
$script:player2 = "Derek Jeter";
return $player;
}
Get-Player
Write-Host $player2
Another interesting example is
$sport = "baseball"
$player = $null
function Get-Player() {
if ($sport -eq "baseball") {
$player = "Evan Longoria"; # (the baseball player)
}
else {
$player = "Eva Longoria"; # (the actress)
}
$player2 = "Derek Jeter";
Print-Player
return $player;
}
function Print-Player {
Write-Host $player2
}
Get-Player
The variable $player2 is defined in Print-Player.
I hope that you find this as interesting as I have. Make sure you tune in to the next episode of PowerShell - Did You Know
No comments:
Post a Comment