トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   迷える子羊の部屋【初心者専用】
     関数クロージャのthis参照について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
MAETOMO
Åê¹ÆNo.35213
投稿日時: 2007-9-24 15:05
新米
居住地:
投稿: 4
使用環境:
MacOSX10.4 FlashCS3
関数クロージャのthis参照について
下記のadobeのヘルプを見ながら関数クロージャのthis参照について調べていて
ヘルプには

関数クロージャの場合、this 参照は汎用です。すなわち、この関数が呼び出された時点で関連付けられているオブジェクトが何であっても、そのオブジェクトを参照します。

と、書かれていますが、"そのオブジェクト"は何を指すのかいまいち分からないでいます

実際下記のコード内の[1]の所にtrace(this)を書いてみると[object global] と出力されますが
それがどのオブジェクトなのかよく分かりません

"この関数が呼び出された時点で関連付けられているオブジェクト"と書かれているので
myProduct、もしくはbarを指しているのかと思いましたが
それを確かめる方法も分からないでいます

どなたか教えてもらえないでしょうか

よろしくお願いします

参考サイト http://livedocs.adobe.com/flash/9.0_jp/main/wwhelp/wwhimpl/js/html/wwhelp.htm

function foo():Function
{
var x:int = 40;
function rectArea(y:int):int // 定義された関数クロージャ
{
trace(this)//[1] 出力 [object global]
return x * y
}
return rectArea;
}
function bar():void
{
var x:int = 2;
var y:int = 4;
var myProduct:Function = foo();
trace(myProduct(4)); // 呼び出された関数クロージャ
}
bar(); // 160
ニノミヤ カズノリ
Åê¹ÆNo.35214
投稿日時: 2007-9-24 17:51
職人
居住地: 東京
投稿: 430
使用環境:
CS4
.4.11, .5.7
XP Pro(sp3)
Flash Player 10,0,22,87,
AIR 1.5.1,
IE 5.5 & 6 & 7 & 8,
Firefox 2.0.0.20 & 3.0.11 & 3.5,
Opera 9.64,
Safari 4,
Google Chrome 2.0.172.31,
Netscape 7.1
Re: 関数クロージャのthis参照について
引用:
実際下記のコード内の[1]の所にtrace(this)を書いてみると[object global] と出力されますが
それがどのオブジェクトなのかよく分かりません

本来、値が返ってくる事自体不思議ですが、AS3.0では[object global]が返ってくるようですね。
ちなみにAS2.0で同じ様な事をした場合、undefinedが返ってきます。

この様な結果が返ってくる理由は、
barメソッド内で宣言しているmyProduct関数がオブジェクトのメソッドではないからです。
(AS3.0では一時的にglobalのメソッドにする為、thisを参照すると[object global]が返ってくるのかもしれません。
しかし、実際のところ詳しい事はわかりません。)

例えばこんな風にしてみたら、thisの結果が変わります。

fooは変更なし

function bar():void
{
	var x:int = 2;
	var y:int = 4;
	//var myProduct:Function = foo();
	this.myProduct = foo();
	//trace(myProduct(4)); // 呼び出された関数クロージャ
	trace(this.myProduct(4));
}
bar(); // 160

結果:
[object MainTimeline]
160


または、
function bar(mc:MovieClip):void
{
	var x:int = 2;
	var y:int = 4;
	//var myProduct:Function = foo();
	mc.myProduct = foo();
	//trace(myProduct(4)); // 呼び出された関数クロージャ
	trace(mc.myProduct(4));
}
//bar(); // 160
bar(this);

var test_mc:MovieClip = new MovieClip();
bar(test_mc);

結果:
[object MainTimeline]
160
[object MovieClip]
160
野中文雄
Åê¹ÆNo.35221
投稿日時: 2007-9-25 2:49
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: 関数クロージャのthis参照について
まず、スクリプトのご質問は[コーダーズルーム]、とくにActionScript 3.0については[ActionScript 3.0特設会議室]にされるのが適切でしょう。後者に投稿するのでなければ、ActionScriptのバージョンも明記すべきです。

ローカルに定義された関数を呼出した場合には、クロージャは生成されません。[object global]というのは、特定のオブジェクトが参照されていないことを示します。

参考: akihiro kamijo「thisとクロージャ
引用:
MAETOMOさんは書きました:
実際下記のコード内の[1]の所にtrace(this)を書いてみると[object global] と出力されますが
それがどのオブジェクトなのかよく分かりません

"この関数が呼び出された時点で関連付けられているオブジェクト"と書かれているので
myProduct、もしくはbarを指しているのかと思いましたが
それを確かめる方法も分からないでいます

クロージャが生成される場合とされない場合との比較は、以下のスクリプトをお試しください。
// フレームアクション
function getFunc():Function {
	var myFunc:Function = function ():void {
		trace(this);
	};
	return myFunc;
}
function closure():void {
	trace(this);
}
function test():void {
	var myFunc:Function = getFunc();
	myFunc();
	var obj:Object = new Object();
	var _mc:MovieClip = new MovieClip();
	obj.closurer = closure;
	obj.closurer();
	_mc.closurer = closure;
	_mc.closurer();
	obj.anonymous = myFunc;
	obj.anonymous();
	_mc.anonymous = myFunc;
	_mc.anonymous();
}
test();


なお、「参考サイト」としてLiveDocsを丸々引用されるのは、現状のご説明にはなりません。そのすべてを読破され、完全に理解されたのであれば、ご質問の余地はないはずです。→【マニュアル(参考書)のとおりにやりました
引用:


----------------
 

MAETOMO
Åê¹ÆNo.35237
投稿日時: 2007-9-26 1:59
新米
居住地:
投稿: 4
使用環境:
MacOSX10.4 FlashCS3
Re: 関数クロージャのthis参照について
ニノミヤさん、野中さんありがとうございます
とても参考になりました
また、今後は適切に質問するように気をつけます

前回質問した時もそうでしたが、説明が不十分でした・・・
現在adobeのAS3のヘルプを順番に読み進めながら勉強していた所なんですが
その関数クロージャの解説にあるコードを使い、いろんな場所でtrace(this)を書いて
thisが何を参照するのか調べていたのですが、[1]の箇所はthisが何を参照しているのか
分からなくて質問させてもらいました

ローカルに定義された関数を呼び出した場合、クロージャは生成されないんですね
また、akihiro kamijoさんの"thisとクロージャ"も参考になりました

ニノミヤさん、野中さんの答えてくださった事と、kamijoさんのサイトを含めて
参考にさせてもらい、まとめてみると、クラスに定義されたメソッドでも無名関数の場合
また、クラスのメソッドとして定義されたものではないメソッド内で定義された
関数のthisに対するクロージャは生成されないと解釈したのですが、正しいでしょうか?
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops