• 締切済み

関数をプロパティとして代入する際

認識が合っているかどうか怪しいのですが、 関数をプロパティで代入する際の引数についての質問ですー。 簡単なサンプルですが、ルート直下に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"); } 宜しくお願いします。

  • Flash
  • 回答数4
  • ありがとう数7

みんなの回答

  • suzuki-_-
  • ベストアンサー率77% (152/195)
回答No.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"); といった参照) } のように、参照の仕方によってアクセスする場所が違うという感じです

  • suzuki-_-
  • ベストアンサー率77% (152/195)
回答No.3

イベントハンドラの関数定義の流れや実行結果に関しては、 #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"); という簡略的な形式も可能です

mstiyflip
質問者

お礼

ありがとうございますー! はぁ~。なるほどです 関数を返す無名関数をひとつかぶせれば = hoge("aaa"); といった形で参照・実行することができるのですねー。 でも、なぜ「=tr;」といった形では実行されるのに、 「=tr("aaa");」では実行されないのでしょうか??? 「return funcion」 関数を返す形はあまりなじみがなかったもので、 これを機に勉強してみます! どうもありがとうございました。

mstiyflip
質問者

補足

↓↓少し自分の回答欄の訂正です >「=tr("aaa");」では実行されないのでしょうか??? ではなく、 「=tr("aaa");」ではマウスダウンに設定できないのでしょうか??? でした。 左辺は同じで、右辺の関数に戻り値があるかないかで 結果が変わるロジックがよく分かりません。。。 宜しくお願いしまっす!

  • BlurFiltan
  • ベストアンサー率91% (1611/1754)
回答No.2

プロパティ ではなく パラメータ のことだと思いますが, そういう細かいことはどうでも良いとして, > _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( ) の場合, ( )内にはロードが成功したかしないかという ブール値 が入ります。 仮に別の方法でできたとしても, 引数は 「ない」 とか 「ブール値」 とか 「ターゲット」 とか 「ロードしたデータ」 とか言う感じで, すでに決まってしまっているのではないでしょうか? とも思います。 イベントハンドラメソッド や イベントリスナー は, そういう特殊な扱いだと勝手に(あくまでも勝手に)認識しています。 ぜんぜん参考にならない回答だとは思いますが...。

mstiyflip
質問者

お礼

>ぜんぜん参考にならない回答だとは思いますが...。 いえいえ!丁寧にありがとうございます! >プロパティ ではなく パラメータ のことだと思いますが, すいません。わかりづらい文章で。。。 1. _root.onMouseDown = tr; この代入の仕方は、 他MCなどのタイムラインからこのtr関数を参照する場合 this.onPress = _root.tr; などと、ルートのプロパティを参照している形になるので、 この代入の仕方を「関数をプロパティで代入」と世間では呼ばれているのかなー。。。 などと推測してみたのです。。 ありがとうございました!

  • is_may
  • ベストアンサー率65% (58/89)
回答No.1

関数を実行するときは [関数までのパス.(省略可)]関数名([引数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にする、というようになります。

mstiyflip
質問者

お礼

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

関連するQ&A

  • アクションスクリプト イベントメソッド

    お願いします。教えていただきたいのですが、 root.onKeyDown = function() { trace("キーダウン"); } this.onMouseDown = function() { trace("マウスダウン"); } として実行すると マウスダウン と表示されますが、          キーダウン  は表示されません。 一体なにがいけないんでしょうか? 参考になるURLとかあったら教えてください。

  • ASで作成したテキストフィールドの文字列を変数に代入

    ASで作成したテキストフィールドの文字列を変数に代入したいのですが上手く出来ずにいます。 とりあえず私の書いたASを下記のように簡略化してみました。下記内容でトレイスしてみると「_level0.I_textField」と出力されます。H_str1 = _root.H_tF; を H_str1 = _root.I_textField.H_tF; と変更してみてもダメでした。 テキストフィールドの文字列を変数に代入するにはどのように行えばよいのでしょうか?ご教授いただきたく思います。よろしくお願いします。 _root.createTextField("I_textField",1,10,10,200,50); var H_tF = _root.I_textField; H_tF.type = "input"; H_tF.text = "表示テスト"; // -- --------------------------------------- _root.I_button1.onRelease = function(){ H_str1 = _root.H_tF; trace(H_str1); }

    • ベストアンサー
    • Flash
  • ActionScript 3.0 D&Dの実装

    ステージ上に、インスタンス20個配置し (addChildは使わずに、普通に最初から置きます。  インスタンス名は mc1 ~ mc20)  それぞれをドラッグアンドドロップで自由に動かしたいです。 以下のようにプログラムを書いたのですが いざドラッグしようとすると 「TypeError: Error #1006: value は関数ではありません at MethodInfo-1()」 っとエラーが出てしまいました。 っと出てしまいました。 一体何が原因でしょうか? また、解決方法がありましたら是非ともよろしくお願いします。 addEventListener(MouseEvent.MOUSE_OVER,getname); function getname(e:MouseEvent) {    var str= e.target.name; trace(str); //マウスカーソルを乗せたムービークリップのインスタンス名が出ます。 addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown); function onMouseDown(e:MouseEvent) { str.startDrag(); } addEventListener(MouseEvent.MOUSE_UP, onMouseUp); function onMouseUp(e:MouseEvent) { str.stopDrag(); } }

    • ベストアンサー
    • Flash
  • 関数を呼んだら、その中の関数も自動実行される?

    ・関数の実行タイミングが分からないので教えてください ・下記で、どうして引数が渡るのでしょうか? ・portal関数を呼んだら、gooプロパティに無名関数が格納される(?)と思うのですが、=関数実行になるのでしょうか? ・無名関数だから? var obj = {  portal : function( arg ) {   var goo = function(arg){    console.log(arg);   }(arg);  } } obj.portal("あ"); ・自分的には、portal関数を呼んで変数gooに無名関数を格納(?)した後、明示的にgoo();と呼ぶ必要があると思うのですが… ・下記でTypeErrorエラーになるのは、gooプロパティが2回呼ばれるから? ・明示的に呼んだ2回目は引数が渡らないから? var obj = {  portal : function( arg ) {   var goo = function(arg){    console.log(arg);   }(arg);   goo();  } } obj.portal("あ"); //TypeError: undefined is not a function

  • 【VBA】ユーザ定義関数が動かない

    【VBA】ユーザ定義関数が動かない 下記のようなプログラムをVBEの標準モジュールに記述して、 ワークシートの適当なセルに「=tc("aa","bb")」と入力してEnterを押した所 セルの表示が「=tc("aa","bb")」となってしまい狙った効果が得られません。 本当は、「aabb」と表示させたいのですが、なぜうまくいかないのでしょうか。 ご教授願います。 ◆関数の仕様  引数1と引数2に入力された文字列を連結して返り値として返す。 ◆コード Function tc(str1 As Range, str2 As Range) As String Dim Str As String Str = str1.Value & str2.Valuett tt = Str End Function

  • javascriptでマウスイベントを拾うとき

    javascriptでマウスイベントを拾うときに、 onLoad関数の中で、 document.onmousedown = mydown; として、 function mydown(e) { として、よくマウスイベントのeを 使いますが、このmydown関数へ引数を増やしてわたしたいのですが、 どうやればいいのですか?普通にカッコのなかにわたすようにしても ダメでした。マウスイベントのeがあるためのように思います。 教えてください。

  • 引数の扱い方

    始めまして。 flash初心者です。 開発環境は flash professional 8 です。 引数の扱い方についてなのですが。 関数の呼び出した先で引数に値を入れて、 関数内で使いたいのですがうまくいきません。 traceで受け取っている値を表示したところ、 希望どうりの値を受け取っているのですが..... なにか根本的なことを間違えているのでしょうか、 どうか教えてください、 宜しくお願いいたします。 function btRollOver(hot) { trace(hot); _root.gotoAndPlay(hot); } box1.onRollOver = btRollOver("frame1");

    • ベストアンサー
    • Flash
  • 外部テキストの値を得るには?

    フラッシュ初心者&質問するのが初めてなので うまく伝わるかどうか心配ですがよろしくお願いいたします。 外部テキストnum.txtにはstr=5という記述があります。 このnum.txtを取り込んで、 5という数値をflash側で変数aaaに代入しました。 --------------------------- var vars = new LoadVars(); vars.load("num.txt"); vars.onLoad = function(num){ if(num){ aaa= vars.str; trace(aaa); } } --------------------------- この場合、ちゃんと5と出力されます。 しかしこの関数内のaaaという変数を他でも利用したいのです。 (例えばvar menu_num:Number = aaa;というように) 単純に下のように記述すると --------------------------- var vars = new LoadVars(); vars.load("num.txt"); vars.onLoad = function(num){ if(num){ aaa= vars.str; } } var menu_num:Number = aaa; trace(menu_num); --------------------------- undefinedが出力されます。 この時にちゃんと5と出力させるにはどうしたらいいのでしょうか。 いろいろグローバル変数など勉強しましたがうまくいきません。 ちなみに外部テキストnum.txtのstr=5というのは、 5という数字のみでもかまいません。 とにかくテキストから数値を取り出す方法を考えています。 ご回答お願いいたします。

    • ベストアンサー
    • Flash
  • 可変個引数の関数

    今現在可変個引数をとる関数を作成しています。 物としてはprintfと同等のものなのですが、可変個引数の取得の方法がわからず停滞してしまっています。 printtest("%s",str); と記述してstrの中身が出力されるようにしたいのです。 どうかご助力のほどよろしくお願いいたします。

  • php 自作関数

    PHPでfunctionによって定義される関数を作っているのですが 引数なしで関数をつくることは可能なのでしょうか? 例えば function hello{ print "HelloPhp"; } 理想ではphp側でhello関数を呼び出せばHelloPhpと出力されます 実際の使い道は関数名が使い辛いので別の名前で関数名を定義したいんです 引数を与えてもいいのですがfunction側で引数が固定されるためphp側と毎回同じ変数:引数にならない 説明し辛いのですが 先ほど述べた理由で使いたいのですが、わかる方いらっしゃったらよろしくお願いします

    • 締切済み
    • PHP

専門家に質問してみよう