For循环变量范围混淆

rhi*_*ino 12 scope for-loop actionscript-3

我注意到for循环中变量的奇怪行为.这不是一个真正的问题,但它让我很烦恼.
实际上我用这种方式创建了两个循环:

for (var i:uint; i<19; i++) SomeFunction (i);
for (var i:uint; i<26; i++) SomeOtherFunction (i);
Run Code Online (Sandbox Code Playgroud)

我收到的是汇编警告:
Warning: Duplicate variable definition.

这个警告让我感到惊讶.在其他语言中没有发生过这种情况.
似乎i变量进入了层次结构中更高的范围,并且在循环块之外变得可用.我也尝试在花括号中包含循环块,但它没有改变任何东西.
为什么会这样?这是正常的吗?有可能避免它吗?现在我只为这两个变量设置了不同的名称,但我认为这不是一个真正的解决方案.我真的很想i在我的大多数for循环中使用-named变量.

Rya*_*ill 14

是的,循环增量变量在循环父级的范围内,而不在循环本身内.这是故意的,例如:

public function getPositionOfValue ( value:String ) : int
{
    for ( var i:int = 0; i < someArray; i++ )
    {
        if (someArray[i] == value )
        {
            break;
        }
    }

    return i;
}
Run Code Online (Sandbox Code Playgroud)

这允许您在循环结束后访问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;
}
Run Code Online (Sandbox Code Playgroud)

然后你摆脱了你的警告.另一件需要考虑的事情是将循环增量变量命名为更具描述性的变量.

更新:另外两件事要考虑:

1)除了颜色和Flex期望uint的地方之外,你不应该使用uints.它们比int要慢.来源] 1更新:在新版本的Flash播放器中可能不再出现这种情况:来源

2)当你在一个循环声明中修改一个循环增量变量时,你想确保你将它设置为正确的初始化值,通常为0.如果你不这样做,你可以很难找到一些bug.


pax*_*blo 6

正如这里提到的,as3具有全局和本地范围,而且就此而言.

它不执行块级范围(或者也可以是for-level).通过提升,您甚至可以在定义变量之前写入变量.这就是我的头脑:-)

Visual C的早期版本有这个错误,导致各种奇妙的时髦宏工作区,但这不是as3中的错误,它按设计工作.您可以将代码限制为for仅在第一个for语句中使用声明,或者将声明移到所有语句之外.

无论哪种方式,这都是接受语言单向工作的问题,即使你认为这是一种不好的方式:-)