第二段代码输出的是2,为什么第一段代码是每秒钟输出一个1?
1、
function main{$r=1;loop} function loop{ while($true) {func;$r;$global:r;start-sleep -seconds 1} } function func{$global:r=2} main
2、
function loop{ while($true) {func;$r;start-sleep -seconds 1} } function func{$global:r=2} $r=1;loop
我不明白为什么第一段代码中$r已经设为了global了,但在while循环内仍然没改变,是不是不应该用global?
1 Answers
Best Answer
$r和 $global:r是两个不同的变量,不能因为$global:r设置了全局,所有的$r就都是$global:r的值了。
当你设置了$global:r,你必须使用$global:r才能读到它的值。
高作用域的值可以被贯穿进低作用域。
但是低作用域却不能直接修改高作用域。
请看示例1:
$var='pstips' function func () { "函数内修改前:$var" $var='pstips.net' "函数内修改后:$var" } func "函数外:$var"
请看示例2:
$global:var='pstips' function func () { "函数内修改前的本地变量被贯穿:$var" $var='pstips.net' "本地变量修改后,全局变量保持不变:$global:var" $global:var='pstips.net' "用global修饰符修改全局变量,全局变量被改变:$global:var" } func
谢谢 总算搞懂了。
看来我之前使用global时一直用错了。因为比如说再你的示例2中,如果在func中执行$global:var=’pstips.net’,然后在函数func内外使用write-host $var,结果都是pstips.net,因此之前一直误以为可以混用。。