在循环中定义变量是否重要?

时间:2012-10-20 09:15:29

标签: performance actionscript-3 flash variables definition

这是我正在撰写的一段代码。

var cList:XMLList = xml.defines.c;
var className:String;
var properties:XMLList;
var property:XML;
var i:int,l:int;
var c:XML;

for each(c in cList)
{
    className = String(c.@name);

    if(cDict[className])
    {
        throw new Error('class name has been defined' + className);
    }

    if(className)
    {
        cDict[className] = c;
    }

    properties = c.property;

    i = 0,
    l = properties.length();

    if(l)
    {
        propertyDict[className] = new Dictionary();

        for(;i<l;i++)
        {
            // ...
        }
    }
}

如您所见,我定义了循环之外的所有变量。我总是担心,如果我在循环中定义它们,它可能会降低处理速度,虽然我没有证据 - 这只是一种感觉。

我也不喜欢as3语法允许在定义之前使用变量名。所以我总是在我的函数的最开始定义变量。

现在我担心这些习惯可能会在某一天适得其反。或者只是个人品味问题?

3 个答案:

答案 0 :(得分:5)

不,因为编译器使用变量提升,所以这意味着编译器将所有变量声明移动到函数的顶部

有关变量的更多解释: http://help.adobe.com/en_US/ActionScript/3.0_ProgrammingAS3/WS5b3ccc516d4fbf351e63e3d118a9b90204-7f9d.html

答案 1 :(得分:1)

AS3 IDE允许您在声明之前使用变量名称,因为他们知道编译器使用一种称为“hoisting”的机制来将所有变量定义移动到函数的顶部。这种情况在您没有注意到的情况下发生,因此您可以方便地使代码更具可读性。因此,如果您手动将所有定义移到顶部,它实际上没有什么区别 - 除非您希望以这种方式构建代码。

出于同样的原因,循环中的变量声明不会影响性能,除非您将这些循环保存在单独的函数中 - 只有这样才会导致实际分配变量。

答案 2 :(得分:0)

很多AS3程序员,包括我在内,会考虑你现在的方式是“正确的”方式,而把变量放在任何一个块中都是“错误的方式”。在这种情况下,速度并不重要,我会尝试以尽可能小的方式呈现双方的论点。

  1. 将变量定义放在与其使用的代码接近的位置。动机很简单:如果变量在某处使用,您可能想知道它在哪里声明。如果您不确定变量的类型或其修饰符,这将非常有用。通常,声明也是放置评论的地方。

  2. 将变量放在实际声明的位置。即使是经验丰富的ActionScript程序员也可能最终通过在块内声明变量来混淆他或她自己,其中看似未初始化的变量会突然包含一些随机值。常见的情况如下:

  3. for (var i:int; i < x; i++) {
        // this loop is entered exactly once, instead of `i' times
        for (var j:int; j < y: j++) { ... } 
    }
    

    还有一个悠久的传统,源于C89标准(又名ANSI C),它没有块范围的变量,也不允许循环内的变量定义。稍后对此进行了更改,以便将变量限定为声明它们的代码块。许多现代的C语言,例如C#对待这样的变量。因此,在上面的示例中,每次输入内部循环时,C#都会重新初始化j

    在其他类似C语言中编写代码的传统更长的程序员会因此相信,一旦他们看到在块内声明的变量,该变量就是作用于块的范围。因此,“提升”被认为是反直觉的。因此容易出错。

相关问题