我注意到 for 循环中变量的奇怪行为。这不是一个真正的问题,但它让我很不安。
实际上,我以这种方式创建了两个循环:
for (var i:uint; i<19; i++) SomeFunction (i);
for (var i:uint; i<26; i++) SomeOtherFunction (i);
我收到的是编译警告:
Warning: Duplicate variable definition.
这个警告真的让我感到惊讶。在其他语言中,我从未发生过这样的事情。
看来
i
变量进入层次结构中较高的范围,并在循环块之外变得可用。我也试过用花括号包含循环块,但它没有改变任何东西。为什么会发生?正常吗?有可能避免吗?现在我只是为这两个变量设置了不同的名称,但我认为这不是一个真正的解决方案。我真的很想使用
i
-在我的大多数 for 循环中命名变量。
最佳答案
是的,循环增量变量在循环父级的范围内,而不是在循环本身内。这是故意的,例如这样的例子:
public function getPositionOfValue ( value:String ) : int
{
for ( var i:int = 0; i < someArray; i++ )
{
if (someArray[i] == value )
{
break;
}
}
return i;
}
这允许您在循环结束后访问 i 的值。在很多情况下,这非常有用。
在同一范围内有多个循环的情况下,您应该做的是循环外的 var i :
public function getPositionOfValue ( value:String ) : int
{
var i:int;
for ( i = 0; i < 15; i++ )
{
//do something
}
for ( i = 0; i < 29; i++ )
{
//do something else
}
return i;
}
然后你摆脱你的警告。要考虑的另一件事是将循环增量变量命名为更具描述性的名称。
更新:需要考虑的另外两件事:
1) 除了颜色和 Flex 需要 uint 的地方之外,您不应该使用 uint。它们的使用速度比 int 慢。来源] 1更新:看起来在较新版本的 Flash 播放器中可能不再是这种情况:source
2) 当您在循环声明中更改循环增量变量时,您需要确保将其设置为正确的初始化值,通常为 0。如果不这样做,您可能会很难追踪错误。
关于actionscript-3 - For 循环变量作用域混淆,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4479896/