feb19.jp blog - life is creative!

続・Function.call()の使い道

ブックマークに追加する tags:    

続・Function.call()の使い道

前回のエントリー「Function.call()の使い道」に関して、いくつか間違い(というか僕の勘違い)があったので、真・Function.call()の使い道、リベンジエントリーです。

この内容は、AS2、3共通の内容になります。同じ考え方でそれぞれ活用できます。今回のコードは、AS2で説明します。

Function.call()は、第一引数に指定するスコープで、任意のFunctionを呼び出すことができるという便利メソッドです。

例えば、AS2において、こんなコードがあったとします。(Test.as)

class Test {
	var basemc;
	function Test(mc) {
		basemc = mc;
		init();
	}
	function init(){
		basemc.btn.onRelease = function() {
			start();
		}
	}
	function start() {
		trace("start!");
	}
}

フレームアクションは、var t = new Test(this);

このとき、btn.onRelease内のstart();はfunction start()を見つけることができないので、上のコードは実行できません。(フレームアクションですべて書いた場合は、実行可能です。)
なので、下記のように修正できます。

class Test {
	var basemc;
	function Test(mc) {
		basemc = mc;
		init();
	}
	function init(){
		var scope = this;
		basemc.btn.onRelease = function() {
			scope.start();
		}
	}
	function start() {
		trace("start!");
	}
}

関数の中で作った変数ならば、btn.onRelease内から参照することができるので、var scope = this;という風にbtn.onRelease外のスコープを保持しておいて、それを利用して、scope.start();を指定してやることができます。

で、本題のFunction.call()という関数についてですが、これの応用的なことができるのです。

class Test {
	var basemc;
	function Test(mc){
		basemc = mc;
	}
	function init() {
		var scope = this;
		basemc.btn.onRelease = function () {
			new CallbackFunction(scope.helloWorld, scope);
		}
	}
	function helloWorld() {
		say();
	}
	function say() {
		trace("hello world");
	}
}

というコードで、下記のCallbackFunction.asを呼び出します。

class CallbackFunction {
	var callback;
	var callbackScope;
	function CallbackFunction(func, scope) {
		callback = func;
		callbackScope = scope;
		
		init();
	}
	function init() {
		callback.call(callbackScope);
	}
}

引数で与えられた関数が、引数で与えられたスコープで実行されます。

つまり、ここで指定しているcallbackScopeは、Test.asのscopeを指しているのです。

で、大丈夫ですよね。

2008年01月30日12:18

Webデザインブログ

「続・Function.call()の使い道」の関連エントリー

 iTunes Store(Japan)

コメント (2)

iotf:

ソース長くなってるよ!w
何に使うの?

feb19:

例えば

var scope = this;
unko_btn.onRelease = function() {
new iotfTween(this, {duration:12, _xscale:200, callback:scope.helloworld, scope:scope});
}
function helloworld(){
trace("unkounko");
}

とか。自作モーションクラスを作ってモーションが終わった後にコールバックするファンクションを送るとか、何か色々使い道はあると思うわん。

コメントを投稿

トラックバック

このエントリーのトラックバックURL:
http://feb19.jp/mt/mt-tb.cgi/129

Navigation

古:Function.call()の使い道
新:AS3で音のボリュームやパンを操作する
トップページ

Recently Entries
Flash 上でパブリッシュしたとき、型宣言されていない変数・関数があったら警告を出す
Flex SDK (mxmlc)や Flex Builder とかで...
Flash Builder 4 Standard 導入
色々メモリリークチェックとか出来る Premium は必要になってか...
Mac でファイルの関連付けを変える(Mac で AIR アプリがアップデート出来ないを解決する方法)
ファイルを右クリックして「情報を見る」を選び、表示されたウィンドウの...
Mac OS X 10.6 Snow Leopard から入ってるフォント「Menlo」がコーディング作業にいい感じ
Xcode でコード書いているとき、Eclipse でコード書くより...
AIR で JSON 形式ファイルの入出力
AIR 祭り開催中。今回はファイル入出力。AS3 で扱っている Ob...
Adobe CS5 ティザーサイトオープン
カウントダウンが始まっています。いよいよ CS5 ですね。globa...
AIR でファイルがドラッグアンドドロップされたことを NativeDragEvent で検知する
最近また AIR が楽しい気がして触っているのですが、 Google...
iPhone アプリ "iBeat - BPM Counter" を発売しました & iPhone インタラクションデザインについて
BPM 計測アプリです。既に似たようなアプリはいくつか発売されている...
AS3 の演算子 ||= について
AS3 だけでつかえるものではないのですが、AS3 での動作を確認し...
iPhone SDK 「カテゴリ」について+NSString の空白文字を除去する
Objective-C では、高位のフレームワークで、低位のフレーム...