2012-01-26 9 views
0

私は自分の知識が不足しています。AS3スコープ(関数の引数付き)

は、このクラスを取る:

public class MyClass 
{ 
    public var width:int = 10; 
    public var height:int = 10; 

    public function MyClass(width:int, height:int) 
    { 
     trace(width, height); 
    } 
} 

出力は常に幅と高さのために供給された値ではなく、MyClassに属し幅と高さのプロパティになります。矛盾するプロパティ名のためのものがあるように思われるにもかかわらず、あなたは上記のエラーを受け取ることはありません。

なぜ、これは機能しますか?また、私のコンストラクタの上で定義された幅と高さは、コンストラクタ内で何らかの形でアクセス可能ですか?

答えて

3

パラメータはフィールド変数名に「影」を付けるので、つまり、コンパイラはあなたがそれらを意味するものと仮定しているので、これは機能します。

this.widththis.heightを使用してメンバーにアクセスできます。これは、コンパイラがすべての暗黙のメンバー呼び出しをバイトコードで変換する事実上の構文です(同じ名前のローカル変数がない場合、widthは自動的にthis.widthに変換されます)。

ところで、FDTのような一部のIDEでは、名前シャドウイングの警告またはエラーメッセージを設定できます。

1

コンパイラは、ローカルスコープの変数に優先順位を与えます。

あなたのケースでは、クラスメンバのvarsが必要な場合は、 "this"を指定する必要があります。

パラメータ(幅と高さ)は、クラスメンバーと完全に異なる変数です。