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 に答える