为什么从另一个函数内部可以成功访问本地定义的变量?

时间:2018-10-02 15:49:52

标签: powershell scope event-handling

请参见下面的代码。将两个文件放在同一目录中,然后从PS ISE运行Form1.ps1

如您所见,(本地)变量$localVar在事件处理程序$button2_Click中定义。因此,我假设{/ {1}}在$localVar的范围之外/将不存在,其范围由定义事件处理程序的花括号定义。

但是,正如您所看到的,我使用$button2_Click的内容将$localVar加载到函数$textbox2.Text中。当您单击fA按钮时,两个文本框都会显示Test

的内容

这是怎么回事?为什么从$localVar内部访问$button2_Click的{​​{1}}?

Form1.ps1

$localVar

Form1.designer.ps1

fA

2 个答案:

答案 0 :(得分:3)

函数fA会看到您的变量,因为它在创建$localVar的脚本块的 child 范围内运行-这是PowerShell的常规行为,而不是特定的到ISE。

当您使用$localVar = ... 创建变量时,它在以下意义上是 local

  • 在相同范围内可见且可直接修改,但在任何 parent 范围内均不可见。

  • 在所有子作用域中
  • 可见,但不能在此处直接修改。

    • 您可以使用$private:作用域修饰符来防止子作用域看到变量。
    • 如果您分配一个最初在 parent 范围(例如$localVar = ...)中创建的变量(仅按名称),则您将创建一个 new (局部变量),在 current 范围内,它遮盖了原始变量。
    • 可以 修改父范围的变量,但是您需要使用Set-Variable -Scope或范围修改器,例如$script:(请参见下面的链接)。
    • li>

有关更多信息,请参见:

答案 1 :(得分:0)

您好,因此在ISE中,您具有Powershell选项卡和脚本选项卡。

Powershell选项卡就像运行单个Powershell控制台一样。该powershell选项卡中的每个Script选项卡都在使用该控制台。因此,如果您在一个脚本中定义

$Hello = "TEST"

然后在ise中运行它。然后,在您运行的同一Powershell标签的另一个脚本标签中

$ Hello

输出为“ TEST”

这称为范围。基本上代码可以看到什么变量。 在Powershell实例中创建的所有变量始终可以在该实例的其余部分中访问

因此,让我们更深入地研究一下示例

function fA
{
    $textbox2.Text = $localVar
}

$button2_Click = 
{
    $localVar = "123"
    $textbox1.Text = $localVar
    fA
}

$ localVar是第一次单击创建的。范围将从此继续到它之后创建的任何内容。因此调用FA,并将$ localvar携带到FA范围。 Textbox1和2显示123。但是,让我们展示一下它还有范围,而不是全局。

function TB1
{
    $localVar = "456"
    $textbox1.Text = $localVar # Will output 456
}

function TB2{
    $textbox2.Text = $localVar # Will output 123
}
$button2_Click = 
{
    $localVar = "123"
    TB1
    TB2
    fA
}
第一次创建的

$ localVar 。传递给第一个函数$ localvar 仍为 123 ,但在该函数中,其更改为 456 。离开后,转到第二个函数,该函数的$ Localvar 将等于 123 。 函数中更改的变量不会影响其父级(即调用方 button2_click

)中的变量