【问题标题】:For-loop variable scope confusionFor循环变量范围混淆
【发布时间】:2011-05-27 15:57:57
【问题描述】:

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

【问题讨论】:

    标签: actionscript-3 for-loop scope


    【解决方案1】:

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

    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) 你不应该使用 uint,除了颜色和 Flex 需要 uint 的地方。它们的使用速度比 int 慢。来源]1 更新:在较新版本的 Flash 播放器中似乎不再是这种情况:source

    2) 当您在循环声明中对循环增量变量进行 var 时,您要确保将其设置为正确的初始化值,通常为 0。如果不这样做,您可能会遇到一些难以追踪的错误。

    【讨论】:

    • 感谢您的有意义的回答。 :) 顺便说一句:1)我不知道uint 更慢。谢谢,将来可能会对我有所帮助。 2) 我知道,但我读到如果 intuint 未初始化,其值始终为 0。
    • 没问题,很高兴为您提供帮助。回复:您对 2) 的回答是正确的,但是如果您在循环之外更改您的 i,那么您的第二个循环现在将具有前一个循环的值。所以要小心。根据我的经验,明确的总是更好。
    【解决方案2】:

    here 所述,as3 具有全局和本地范围,仅此而已。

    它不做块级作用域(或for-level)。通过提升,您甚至可以在定义变量之前写入变量。 那是让我头疼的一点:-)

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

    无论哪种方式,这是一个接受语言以一种方式工作的问题,即使你可能认为这是一种糟糕的方式:-)

    【讨论】:

      【解决方案3】:

      在循环外声明变量 i 以避免这种情况。只要您重置它(i = 0),您仍然可以在所有循环中使用它。

      var i : uint;
      for (i=0; i<19; i++) SomeFunction(i);
      for (i=0; i<26; i++) SomeOtherFunction(i);
      

      【讨论】:

        猜你喜欢
        • 2011-12-06
        • 2016-10-22
        • 2015-09-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-16
        • 2020-01-19
        • 2012-06-12
        相关资源
        最近更新 更多