ファンクションの呼び出しの違い

ファンクションの呼び出しの違いについてなんとなく書いてみる.
どーでもいいんだけど,長くなった…(;;´;-;;`;)


ECMA-SCRIPTだとファンクションという型自体が上書き,消去可能ですねっと.

this.hoge = function() {
  trace('ok');
};
this.fuga = this.hoge;

this.fuga();

// 出力
// ok

これでfugahogeと同一の機能を持つことになる.
もうちょっというと,fugahogeへのメモリ参照を持つ(エイリアスが貼られる)ことになる.

しかし,この場合まだhogeの準備が整っていなくて代入をしてしまったときはundefinedが代入され,エイリアスではなくただ単にundefinedが入ってしまう.

つまりは,this.hogeが定義済みなことを保障した後にthis.fugaに対して代入してあげにゃならん.

ためしに宣言を代入の後に持ってくると

this.fuga = this.hoge;

this.hoge = function() {
  trace('ok');
};

this.fuga();

// 出力
// (なし)

そして気をつけなくてはいけないのはhoge内にthis参照があるとこれはfugaからみた参照先をthisとみなす.

これを回避したければ(Flashでは)mx.utils.Delegateを使ってあげるとthisの参照先を第1引数で指定してあげることができる.
(記述がきれいになるので最近はイベントハンドラに対する割り当てに多用ちぅ.)

あと,fuga自体はhogeのときに宣言された無名関数への参照が割り当てられているのでfugaもその参照先を見る.
ということは,hogeの実装を変えてしまうと

this.hoge = function() {
  trace('ok');
};
this.fuga = this.hoge;

this.fuga();
this.hoge();

this.hoge = function() {
	trace('ok2');
};

this.fuga();
this.hoge();

// 出力
// ok
// ok
// ok
// ok2

このようにfugaの知らないところでhogeの参照先が変わっちゃってる.

でわ,こちらは?

this.fuga = function() {
  this.hoge();
};

this.fuga();

this.hoge = function() {
  trace('ok');
};

this.fuga();

// 出力
// (なし)
// ok

これはfugaに対して(無名)ファンクションを定義.
んで,そのファンクション経由でhogeを実行.

出力結果を見て分かるようにhogeが存在したあとの実行はキチンと出力結果が出る.

そして,途中でhogeの実装が変わっても

this.fuga = function() {
  this.hoge();
};

this.hoge = function() {
  trace('ok');
};

this.fuga();

this.hoge = function() {
  trace('ok2');
};

this.fuga();

// 出力
// ok
// ok2

これはfunction {}の中身は宣言したときには何もされない.
実行されたときに初めて中を見るため,実行毎にhogeを見に行っているからですね.

先の例と違うのはfugaは宣言された無名関数へのメモリ参照を渡すのではなく,実行時にhogeの指す無名関数を実行するという点です.

上の2つは一見同じファンクションを叩くように見えるけど意味合いが異なるのでなにを実現したいかによって違ってきますよっておはなし.


contributor nao : 2005年08月30日 17:01

trackback

trackback for this entry URL:
http://blog.graffiti-web.org/mt/mt-tb.cgi/291

comment