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

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   ActionScript 3.0 特設会議室
     Function.apply の this について
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
takanism
Åê¹ÆNo.34614
投稿日時: 2007-8-9 21:03
新米
居住地:
投稿: 3
使用環境:
WinXP SP2
Flash CS3
Function.apply の this について
お世話になっております。
かなり悩んだのですが、どうしても分からないので質問させていただきます。

Function.apply

についてです。
このメソッドの第一引数には、適用先オブジェクトを指定しますよね。
そこで以下のコードをメインタイムラインの第一フレームに書きました。


----------
var mc:MovieClip = new MovieClip;
addChild(mc);

function test ():void {
trace(this);
}

trace(this);
trace(mc);
test();
test.apply(mc);
----------


期待したトレース結果は、

[object MainTimeline]
[object MovieClip]
[object MainTimeline]
[object MovieClip]

なのですが、実際の出力は以下でした。

[object MainTimeline]
[object MovieClip]
[object MainTimeline]
[object MainTimeline]


mc を基準として test を呼ぶので、test 内の this は mc を指す。
という理解をしてたんですが…。

出力結果がそうなっているので自分の理解が間違っているとは思いますが、
そうなるとこの第一引数は意味が無いのではと思えてきます。

よろしければご教授いただければと思います。
ニノミヤ カズノリ
Åê¹ÆNo.34619
投稿日時: 2007-8-10 2:11
職人
居住地: 東京
投稿: 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: Function.apply の this について
引用:
mc を基準として test を呼ぶので、test 内の this は mc を指す。
という理解をしてたんですが…。
この考え方は間違っていません。
その証拠に、使用するActionScriptを3.0から2.0に変更してテストすると、takanismさんの期待通りの結果が表示されます。

原因としては、
function hoge() {}
上記の関数の定義文に対する解釈の仕方が2.0と3.0では異なっている為だと思われます。

ActionScript3.0にて期待通りの結果を出したい場合は、下記の様に書き直さなければなりません。
var mc:MovieClip = new MovieClip;
addChild(mc);

var test:Function = function():void {
    trace(this);
}

trace(this);
trace(mc);
test();
test.apply(mc);
takanism
Åê¹ÆNo.34620
投稿日時: 2007-8-10 11:27
新米
居住地:
投稿: 3
使用環境:
WinXP SP2
Flash CS3
Re: Function.apply の this について
ニノミヤさん

ご返信どうもありがとうございました。
version の違いなんですね。すっきりしました。

prototype.js の bind をやりたかったんですが、
以下のように(無意味な code ですが)普通に class 定義した method では難しいですね…。

----------
Utilities.as

package {
public class Utilities {
public static function bind ($func:Function, $context:Object=null, ... $rest):Function {
return function (... $arg):* {
return $func.apply($context, $arg.concat($rest));
}
}
}
}

----------
Main.as = DocumentClass (not strict mode)

package {
import flash.display.*;
public class Main extends Sprite {
public function Main () {
var mc:MovieClip = new MovieClip;
Utilities.bind(noaction, mc)(); // this = mc これは OK
Utilities.bind(noaction2, mc)(); // this = Main これは NG
}
public var noaction:Function = function ():void {
this.gotoAndStop(1);
trace('no problem.');
}
public function noaction2 ():void {
this.gotoAndStop(1);
trace('no problem.');
}
}
}
----------

うーん、noaction2 が動いて欲しいなぁ(笑)
みなさん bind みたいな事をされる時はどうされてるんですかねぇ…。
ニノミヤ カズノリ
Åê¹ÆNo.34621
投稿日時: 2007-8-10 11:53
職人
居住地: 東京
投稿: 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: Function.apply の this について
引用:
takanismさんは書きました:
public function noaction2 ():void {
    this.gotoAndStop(1);
    trace('no problem.');
}
上記のコードをnoactionと同じ書き方にすれば期待通りの動きをしますが、それでは駄目なのでしょうか?

public var noaction2:Function = function ():void {
    this.gotoAndStop(1);
    trace('no problem.');
}
ニノミヤ カズノリ
Åê¹ÆNo.34623
投稿日時: 2007-8-10 12:28
職人
居住地: 東京
投稿: 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: Function.apply の this について
ちなみに下記のリンクに詳しい説明が載っています。

[関数のスコープ]
[バインドメソッド]
takanism
Åê¹ÆNo.34624
投稿日時: 2007-8-10 17:26
新米
居住地:
投稿: 3
使用環境:
WinXP SP2
Flash CS3
Re: Function.apply の this について
お世話になっております。

引用:
上記のコードをnoactionと同じ書き方にすれば期待通りの動きをしますが、それでは駄目なのでしょうか?


いえ、全然大丈夫です。
何となく noaction2 の書式で動いて欲しい気がした、というだけですので。
お騒がせしました。

また、参考リンクもどうもありがとうございました。
さっそく読んでみますね。

いろいろとご教授どうもありがとうございました。
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

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