For循环变量范围混淆

时间:2010-12-18 20:05:25

标签: actionscript-3 for-loop scope

我注意到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 - 命名变量。

3 个答案:

答案 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);