« Quicksilverでカップラーメンを食べよう | メイン | FlashのログをFirebugに出す方法 »

ActionScriptでthisがundefinedになる

del.icio.us it!   hatena bookmark

右クリックからメソッドを呼び出した場合、thisがundefinedになりますた。。。
AS2っす。


var my_cm:ContextMenu = new ContextMenu();
my_cm.customItems.push(new ContextMenuItem("hoge", hoge));
function hoge(obj, item) {
trace(this); // undefined
}
this.menu = my_cm;

そーいうもんなのかな。

fladdict.net blog: JavaScript, ActionScriptにおける .this とは何なのか?
http://www.fladdict.net/blog-jp/archives/2005/09/javascript_acti.php

これを読むと、thisってのは
「その関数を、何のプロパティと解釈して呼び出したか?」
とあるけど、この場合、関数は「未定義な何か」から呼び出されたってことなのか。。。

うーん、よくわからん。

追記

ActionScript3でやってみた
呼び出されたメソッドのthisは「[object ContextMenuExample]」だった


package {
import flash.ui.ContextMenu;
import flash.ui.ContextMenuItem;
import flash.events.ContextMenuEvent;
import flash.display.Sprite;

public class ContextMenuExample extends Sprite {
private var myContextMenu:ContextMenu;

public function ContextMenuExample() {

myContextMenu = new ContextMenu();
var item:ContextMenuItem = new ContextMenuItem("hoge");
myContextMenu.customItems.push(item);
item.addEventListener(ContextMenuEvent.MENU_ITEM_SELECT, hoge);
this.contextMenu = myContextMenu;
}

private function hoge(event:ContextMenuEvent):void {
trace(this); //[object ContextMenuExample]
}

}
}



Flash Math & Physics Design:ActionScript 3.0による数学・物理学表現[入門編] 集合知プログラミング ビジュアライジング・データ —Processingによる情報視覚化手法 御岳百草丸 1200T

トラックバック

このエントリーのトラックバックURL:
http://un-q.net/mt-tb.cgi/84

コメント (3)

{eL_e3電気を大切に:

AS2のやつは、ただ関数を渡してるだけなので、thisを参照しても何もないんじゃない?

Deleagateクラスを使ってみよ

import mx.utils.Delegate;
var my_cm:ContextMenu = new ContextMenu();

my_cm.customItems.push(new ContextMenuItem("hoge", Delegate.create(this, hoge)));

function hoge(obj, item) {

trace(this); // _level0 

}

this.menu = my_cm;

Deleagateクラス使えばきれいに書けますね。
ありがとうございます。

でもthisがundefinedになるってのがどーしても気持ち悪いなー

{eL_e3:

>でもthisがundefinedになるってのがどーしても気持ち悪いなー
あー、そういうことですか。
たぶんContextMenuItemはFlash playerがOSの機能を利用して表示してるわけで、FlashのコンポーネントやMCじゃないってことじゃないですかね。

だからコンストラクタでコールバックを指定したら変更できないし、ラベルも書き換えできないんじゃないでしょか

最初、内部で

function func(){
trace(this)
}

func.call(undefined);

とでもなってるかと思ったんですけど、
これだと出力が

[type Object]

なんですよね。確かに気持ち悪いわ

コメントを投稿

書いたよ!