- 2009年1月23日 13:32
- ActionScript 3.0
プログラミング経験者なら誰もが一度は思ったことがあると思うこの問題。
言語によって違いはありますが、ActionScript3.0に関して言えば、
書籍やネットを参照しても、答えはまちまちだったりします。
果たして、本当はどれなのでしょうか?
その答えは、本家を見てみることにしましょう。
Adobe ActionScript 3.0 ActionScript 言語とシンタックス 関数
関数 は、特定のタスクを実行し、プログラム内で再利用できるコードブロックです。 ActionScript 3.0 には、メソッドと関数クロージャの 2 種類の関数があります。関数をメソッドと呼ぶか関数クロージャと呼ぶかは、関数が定義されたコンテキストによって決まります。関数をクラス定義の一部として定義した場合、またはオブジェクトのインスタンスに関連付けた場合は、メソッドと呼びます。関数がその他の方法で定義された場合は、関数クロージャと呼びます。
まとめると、
- AS3の関数には関数クロージャとメソッドがある(つまり両方とも関数の一種)
- static属性キーワードによってクラスに属する関数(いわゆる静的メソッド、Math.sin()・ExternalInterface.call() etc...)や、クラスのインスタンスに関連づけられた場合(MovieClip.gotoAndPlay(),Array.push() etc..)はメソッド
- 関数が2以外の方法で定義された場合は関数クロージャとなる。
となります。
簡単に言えばクラス定義に含まれていたらメソッド、それ以外なら関数クロージャとなるわけですが、じゃぁそれ以外って何よ、となります。
例えばgetTimer()はどこのクラスにも関連しせず、flash.utilsパッケージに属するため、関数クロージャです。同様にtraceは、どのパッケージにもクラスにも属さず、トップレベルに属しているため、関数クロージャとなります。
他にも、.imajukさんのエントリーにもあげられているように、メソッド内に定義された関数が関数クロージャになります。
しかし、冒頭でも述べたように実際呼び方に関してはかなり曖昧な使われ方をしているようです。リファレンス中でも、関数クロージャとして定義されているものに対してもメソッドという使われているものもあります。
この関数とメソッドの呼び方の使い分け・違いについての補足・修正は大歓迎しています。いやいやてめーこりゃ違うよ!俺はこうだからこう呼ぶ!っていうのがありましたらじゃんじゃんコメくださいませ。



