ActionScript3のthisが関数単位のスコープだよ

AS3でプログラムを書いている人、ほぼ全員が混乱しているthisのスコープの話。
あれば実は、クラスごとにthisが決まるわけじゃなくて、呼び出されるたびに決っているんだ。

thisは関数の隠し引数

AS3で全ての関数は隠し引数として、thisを受け取っている。

function f(x : Int, y : Int){
  ...
}

だから、こんな2つの引数を受けとる関数は、実際は3つの引数を受け取っている。

function f([this : Object,] x : Int , y : Int){
  ...
}

引数だから実際のthisがどんな値になるかは、定義されている場所ではなくて、呼び出し方によって決まる。

自動でスコープチェーンに追加される

さらに、一部の関数では受けとったthisをスコープのトップに追加している。

だから

function f(){
   return x;
}

と書くだけでthis.xにアクセスできたりする。

詳しくは調べていないけど、基本的に内部関数以外はthisをスコープに追加している気がする。

要するに

thisが書いている場所で、レキシカルに決まると思っていると混乱しちゃうよ。