我注意到for循环中变量的奇怪行为。这不是一个真正的问题,但它让我很烦恼 实际上我用这种方式创建了两个循环:
for (var i:uint; i<19; i++) SomeFunction (i);
for (var i:uint; i<26; i++) SomeOtherFunction (i);
我收到的是汇编警告:
Warning: Duplicate variable definition.
这个警告让我很惊讶。在其他语言中没有发生过类似的事情
似乎i
变量进入了层次结构中较高的范围,并且在循环块中可用。我也尝试在花括号中接受循环块,但它没有改变任何东西
为什么会这样?这是正常的吗?有可能避免它吗?现在我只为这两个变量设置了不同的名称,但我认为这不是一个真正的解决方案。我真的很想在我的大多数for循环中使用i
- 命名变量。
答案 0 :(得分:14)
是的,循环增量变量在循环父级的范围内,而不在循环本身内。这是故意的,例如:
public function getPositionOfValue ( value:String ) : int
{
for ( var i:int = 0; i < someArray; i++ )
{
if (someArray[i] == value )
{
break;
}
}
return i;
}
这允许您在循环结束后访问i的值。在很多情况下,这非常有用。
在同一范围内有多个循环的情况下,您应该做的是在循环外部使用var:
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的地方之外,你不应该使用uints。它们比int要慢。来源] 1 更新:在较新版本的Flash播放器中可能不再出现这种情况:source
2)当你在一个循环声明中修改一个循环增量变量时,你想确保你将它设置为正确的初始化值,通常为0.如果你不这样做,你可以很难找到一些错误。
答案 1 :(得分:6)
如上所述here,as3具有全局和局部范围,就是它。
它不执行块级范围(或者也可以是for-level)。通过提升,您甚至可以在定义变量之前写入变量。 那是可以解决的问题: - )
早期版本的Visual C有这个错误,导致各种奇妙的时髦宏工作区,但这不是as3中的错误,它按设计工作。您可以将代码限制为仅在第一个for
中使用声明,或者将声明移到所有for
语句之外。
无论哪种方式,这都是接受语言单向运作的问题,即使你认为这是一种不好的方式: - )
答案 2 :(得分:3)
在循环外声明变量 i 以避免这种情况。只要你重置它(i = 0),你仍然可以在所有循环中使用它。
var i : uint;
for (i=0; i<19; i++) SomeFunction(i);
for (i=0; i<26; i++) SomeOtherFunction(i);