1

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

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 语法允许在定义之前使用变量名。所以我总是在函数的最开始定义变量。

现在我担心这些习惯有一天会适得其反。还是只是个人口味的问题?

4

3 回答 3

5

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

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

于 2012-10-20T09:49:02.247 回答
1

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

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

于 2012-10-20T09:55:16.990 回答
0

许多 AS3 程序员,包括我在内,都会认为你现在拥有它的方式是“正确的”方式,而将变量放在任何块中都是“错误的方式”。在这种情况下,速度无关紧要,我会尽量以不偏不倚的方式提出双方的论点。

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

  2. 将变量放在实际声明它们的位置。即使是经验丰富的 ActionScript 程序员,最终也可能会因为在块内声明变量而迷惑自己,因为在这些块中看似未初始化的变量会突然包含一些随机值。常见情况如下所示:

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# 都这样对待变量。j因此,在上面的示例中,每次进入内部循环时,C# 都会重新初始化。

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

于 2012-10-22T00:33:03.367 回答