アプリ版:「スタンプのみでお礼する」機能のリリースについて

認識が合っているかどうか怪しいのですが、
関数をプロパティで代入する際の引数についての質問ですー。

簡単なサンプルですが、ルート直下にaaaと出力する関数trを定義し、
ルートのマウスダウンに当てます。

_root.onMouseDown=tr;
function tr() {
trace("aaa");
}

この場合はきちんと"aaa"と出力されるのですが、
下記のようにtrに引数を持たせた場合、
プロパティとしてマウスダウンに当てることは可能なのでしょうか?

function tr(str:String){
trace(str);
}



_root.onMouseDown= ???


下記のように普通にfunctionから呼び出すしかないのでしょうか?
_root.onMouseDown=function(){
tr("aaa");
}

宜しくお願いします。

A 回答 (4件)

> 「=tr("aaa");」ではマウスダウンに設定できないのでしょうか???


> 左辺は同じで、右辺の関数に戻り値があるかないかで
> 結果が変わるロジックがよく分かりません。。。

マウスダウンに設定できる・できないという意味では前回の回答で可能なので"できる"です
ただ、なぜ return を使ってfunctionを返すの?ということなので
その必要性を理解していきましょう

////////

よくある変数同士の代入の場合
a = 1;
b = a;
とすれば変数aを参照し代入されている内容 1 が、変数bに代入されます、しかし
b = a();
では b に 1 は代入されません

これと一緒で「=tr;」の形はtrを参照し、その値=functionを代入してくれます

「=tr("aaa");」のほうですが、#2の方の説明にもあるように、
末尾に「()」を付けることで、値の実行を試み可能なら実行します
「=tr("aaa");」だと、tr を参照して値を返すのではなく、実行するのです
ここが大きな違いで、今回の結果を理解するために最も重要な部分です

これを踏まえ、「=tr("aaa");」のような形で左辺にfunctionを代入するには、
実行した結果でfunction自体を戻り値として返す必要があるというわけです

/////ここから下は参考程度に/////

更に細かいことを言うと、以下は私の感覚的なもので、
実際の構造を示しているわけではありませんが

trのまとまり {
 set > this.value = value
 └> 書き込み用 自身の値を変える(tr = ~; といった参照)
 get > return this.value
 └> 読み取り用 自身の値を返す(今回の ~ = tr; といった参照)
 method > function(){statement}
 └> 実行用 自身のstatementを実行する(今回の tr("aaa"); といった参照)
}

のように、参照の仕方によってアクセスする場所が違うという感じです
    • good
    • 0

イベントハンドラの関数定義の流れや実行結果に関しては、


#2の方が詳しく説明してくれているので省くとして、
今回の例で言うと、
_root.onMouseDown=function(){
tr("aaa");
}
という形で tr が実行される無名関数を代入したいわけですから、
_root.onMouseDown= ???;という短い形で記述したいならば、
関数を実行して、trに引数を指定して実行する無名関数を返してあげれば可能です

function tr(str:String){
trace(str);
}
function hoge(str:String) {
return function () {
tr(str);
};
}
_root.onMouseDown = hoge("aaa");

////////

上記のユーザ定義関数 tr 自体が、動的に変更されないのならば、
そのまま無名関数の中に処理を記述する下記のような方法

function hoge(str:String) {
return function () {
trace(str);
};
}
_root.onMouseDown = hoge("aaa");

という簡略的な形式も可能です

この回答への補足

↓↓少し自分の回答欄の訂正です

>「=tr("aaa");」では実行されないのでしょうか???
ではなく、
「=tr("aaa");」ではマウスダウンに設定できないのでしょうか???

でした。


左辺は同じで、右辺の関数に戻り値があるかないかで
結果が変わるロジックがよく分かりません。。。

宜しくお願いしまっす!

補足日時:2007/12/03 06:16
    • good
    • 0
この回答へのお礼

ありがとうございますー!

はぁ~。なるほどです
関数を返す無名関数をひとつかぶせれば
= hoge("aaa");
といった形で参照・実行することができるのですねー。


でも、なぜ「=tr;」といった形では実行されるのに、
「=tr("aaa");」では実行されないのでしょうか???


「return funcion」
関数を返す形はあまりなじみがなかったもので、
これを機に勉強してみます!

どうもありがとうございました。

お礼日時:2007/12/03 04:12

プロパティ ではなく パラメータ のことだと思いますが,


そういう細かいことはどうでも良いとして,

> _root.onMouseDown= ???

ですよね。

私も _root.onMouseDown= ??? 状態です。
以前私も考えたことがあって,少しだけチャレンジしてみましたが,
今も _root.onMouseDown= ??? 状態です。


??? の部分には関数名または関数自体を入れなければならないので,

_root.onMouseDown = tr;

しかできません。

_root.onMouseDown = tr("FLASH");

これでは,関数の代入ではなくて実行になってしまいますし,

function _root.onMouseDown("FLASH");

これでは Flashに怒られるだけですし,

_root.onMouseDown = function tr("FLASH");

これでも怒られます。

やっぱり書かれていらっしゃるように,

_root.onMouseDown=function(){
tr("aaa");
}

または,改行を取っただけで同じですが,

_root.onMouseDown=function(){tr("aaa")};

のように書くしかないと思います。
私も個人的にそう思うだけで,"全く自信はありません" が,そう思います。
過去もそこら辺であきらめましたし,
今回のご質問を見て再チャレンジしてみましたが,やっぱりあきらめました。



思うのですが,

LoadVars.onLoad = function( ) { };

のような場合,function( ) の ( ) 内に入る物って決まっていますよね。
LoadVars.onLoad = function( ) の場合,
( )内にはロードが成功したかしないかという ブール値 が入ります。

仮に別の方法でできたとしても,
引数は 「ない」 とか 「ブール値」 とか 「ターゲット」 とか 「ロードしたデータ」 とか言う感じで,
すでに決まってしまっているのではないでしょうか?
とも思います。

イベントハンドラメソッド や イベントリスナー は,
そういう特殊な扱いだと勝手に(あくまでも勝手に)認識しています。

ぜんぜん参考にならない回答だとは思いますが...。
    • good
    • 0
この回答へのお礼

>ぜんぜん参考にならない回答だとは思いますが...。
いえいえ!丁寧にありがとうございます!

>プロパティ ではなく パラメータ のことだと思いますが,
すいません。わかりづらい文章で。。。

1. _root.onMouseDown = tr;
この代入の仕方は、
他MCなどのタイムラインからこのtr関数を参照する場合
this.onPress = _root.tr;
などと、ルートのプロパティを参照している形になるので、
この代入の仕方を「関数をプロパティで代入」と世間では呼ばれているのかなー。。。
などと推測してみたのです。。


ありがとうございました!

お礼日時:2007/12/03 03:46

関数を実行するときは



[関数までのパス.(省略可)]関数名([引数1,引数2,・・・]);

という形になります。関数名の括弧内には実行する際に関数に対して任意の値を入れることが出来ます。
例えば

function tr(str:String){
trace(str);
}
tr("aaa");

このように関数を実行するときに括弧内に値を指定すれば、関数trないに指定した値が代入され、実行されます。
↑の例では関数trないの変数strに文字列「aaa」が代入される形になります。また引数はいくつでも設定できますので、

function move(tar:MovieClip,val:Number){
tar._x = val;
}
move(_root.symbol,100);

とすればルートに配置されている「symbol」と言うインスタンス名のMCのX座標を100にする、というようになります。
    • good
    • 0
この回答へのお礼

意図の読み取りづらい質問に
わざわざ回答していただいてありがとうございます!

お礼日時:2007/12/03 03:29

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!