powershell - 复合赋值运算符在子范围内如何表现?

标签 powershell scope

以下两个功能会发生什么?我希望他们是一样的。

PS C:\> $i = 5
PS C:\> function Test1 { $i += 1; $i }
PS C:\> function Test2 { $i = $i + 1; $i }
PS C:\> Test1
1    # why?
PS C:\> Test2
6
PS C:\> $i
5    # will not change
我知道函数中的$ i具有局部范围,因此不会在全局范围内更改,这是有意的。这个问题只是关于以下两个赋值语句为什么在这里表现不同的原因,据我所知,它们应该是等效的。
$i = $i + 1
$i += 1

最佳答案

说明:
Test1中,为变量$i分配了一个值(使用复合赋值运算符)。由于您无法从全局范围更改该变量,因此将创建一个新的本地变量(隐藏该全局变量),该变量最初没有值(基本上为0),然后又增加了1。返回值时,使用局部变量。

function Test1 {
  # because it's an assignment, a new local variable
  # is created (with initial value = 0)
  $local:i += 1
  $local:i
}
Test2中,使用了全局变量$i的值(因为该变量在此子作用域中可见),添加了1,并将结果(6)分配给新的本地变量。与Test1中一样,最后返回本地变量的值。
function Test2 {
  # a new local variable is created, but because the global
  # variable is visible here, its value is used initially
  $local:i = $global:i + 1
  $local:i
}
在此处阅读有关范围的更多信息:about_scopes

关于powershell - 复合赋值运算符在子范围内如何表现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64097122/

相关文章:

python - 作用域,使用当前模块中的函数

c# - 使用PowerCLI for .NET在VMware vSphere Client上拦截错误消息

powershell - PowerShell 中 [Char[]] 的用途

regex - Powershell正则表达式

javascript - 如何调用异步函数以在全局范围内使用 return

r - 存在并应用 : why are these functions different?

java - Spring:单例/ session 范围和并发

javascript - 这适用于某些功能,但不适用于其他功能

windows-10 - 从 PowerShell 调用 Windows Shell 函数?

asp.net - 在需要重新编译之前,IIS 将已编译的 ASP.NET 在缓存中保留多长时间?