JavaScriptのfunctionについての疑問

このQ&Aのポイント
  • JavaScriptでのfunctionの使い方と意味について質問です。特に= function()という表記に関して理解できない点があります。ご教授いただければ幸いです。
  • JavaScriptのfunctionについて理解できない点があります。特に= function()という部分についてお答えいただければ幸いです。
  • JavaScriptでのfunctionの使い方がよく分からないです。特に= function()という表記について教えていただけると助かります。
回答を見る
  • ベストアンサー

function

http://www.1art.jp/flash/le/lesson31/lesson31.htm 上記HPの下記のfunctionについては、理解はできたつもりです。 function funcName() { trace("funcName();がここで呼び出されました。"); } 例えば function F_tasizan(num1, num2) { A = num1+num2; } F_tasizan(1,2); trace(A); といった具合に、以後定義したF_tasizan( , )と書くだけで二つの数字が足し算されるし、他の式で書けばその式にしたがった答えをF_tasizanで簡単に求められるということですよね。 しかし、2例目の myMc_mc.onEnterFrame = function() { myMc_mc._x += 1; } の = function()が理解できません。myMc_mc.onEnterFrame という部分については イベントハンドラメソッド であり他のサイトなども参考に分かった気がするのですが、 = function()が上手く理解できません。というよりこれは単にお約束という形で1つ目の例とは全く関連しないものなのでしょうか? ご教授いただきたく思います。よろしくお願いします。

  • Flash
  • 回答数1
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
noname#35109
noname#35109
回答No.1

面白いですね。  「象は鼻が長い。」   →象が主語!?  鼻が主語!? 普通に日本語を使っていると, 象が主語でも鼻が主語でもどっちでもよくて, 単に,「象は鼻が長い」と聞くだけで,意味はわかりますし,自分でもよく使います。 しかし「文法的に説明せよ」と言われると難しいですね。 「象は鼻が長い。」 と同様, myMc_mc.onEnterFrame = function() { } も,いざ聞かれると難しいですが,私は次のようにとらえています。 私は フィーリング人間 なので間違っているかもしれませんが。 function の前に, まずイコール (=) ですが,これは代入演算子です。 myMc_mc.onEnterFrame = ○○ これで, 「myMc_mc.onEnterFrame に ○○ を代入せよ。」 ということになります。 それで実際の ○○ は何かというと function() です。 function() とはつまり,無名の関数です。 そして,無名の関数の実体は何かと言われると,  function() { } の { } 内に書かれたステートメント(群)となります。 つまり,  myMc_mc.onEnterFrame = function() {    myMc_mc._x += 1;  } この場合は,  myMc_mc.onEnterFrame というイベントハンドラに,  myMc_mc._x += 1;  というステートメント(この場合は単体)を代入しなさい。 ということになります。 ちなみに, ------------------------------- function myfunc(){ trace("あ"); } _root.onEnterFrame = myfunc; ------------------------------- これではどうなるでしょうか? myfunc という,「あ」 を trace する カスタム関数を, _root.onEnterFrame に代入するわけですから,  あ  あ  あ  あ  … と trace されます。 つまり, ------------------------------- _root.onEnterFrame = function() { trace("あ"); }; ------------------------------- と同じ意味になります。 つまり,  myMc_mc.onEnterFrame = function() { } は, 「myMc_mc.onEnterFrame に } 内に書かれたステートメントを実行する無名の function を代入せよ。」 という意味になります。 他の回答者の方, 間違っていましたら回答ならびに訂正のほど, よろしくお願いいたします。 とにかく私は,フィーリング人間なもので,上記のようにとらえている次第です。

goo2408
質問者

お礼

sassakunさん、書き込みありがとうございます。 大変大変わかりやすいご回答ありがとうございます。 理解できました。あとは繰り返し自分で使ってみてしっかり習得するだけですね。 丁寧なご回答本当にありがとうございました(^0^)。

関連するQ&A

  • Tweenerの繰り返しについて

    こんばんわ。 Tweenerの繰り返しについてですが、 3つの写真があり、それぞれライブラリで書き出し済みです。 そして、その3つの写真をフェードイン・フェードアウトで切り替えることに成功したのですが、その3つの写真を続けて繰り返し(無限ループ)ができません。 TweenerのonCompleteを使ってtween(myMc,i)に戻ってもスタックオーバーフローになってしまい、うまくいきません。 こちらソースになります↓ for (var i:int=1; i<=3; i++) { var mc_str:String = "photo0" + i; var myClassMc:Class = Class(getDefinitionByName(mc_str)); var myMc:MovieClip = new myClassMc(); main_mc.addChild (myMc); myMc.visible = false; myMc.name = mc_str; tween (myMc,i); } function tween (MC:MovieClip, num:Number):void { var _num:Number = num - 1; if (num >= 1) { trace (_num+"枚目通過"); Tweener.addTween(MC, { alpha:0, onComplete:function():void{MC.visible=true;},delay:1+(_num*5) }); trace (_num+"枚目終わり"); Tweener.addTween (MC, { alpha:1, transition:"linear", time:3, delay:1+(_num*5) }); trace (_num+"枚目準備完了!"); } } どうか、ご教授のほうよろしくお願いします。

    • ベストアンサー
    • Flash
  • 複数のムービークリップについて

    毎度すみません。 複数のムービークリップ(以下MC)をステージに時間差でバラバラの位置に登場させたいのですが、最初で行き詰まってしまいましたのでご質問させてください。 5個のMC(1~5)をステージに配置し、インスタンス名をmc1~mc5で振っています。 スクリプトレイヤーに以下の様に記述しています。 ------------ for(i=1;i<5;i++){ var mc = this["mc"+i]; mc.num = i; } mc.num._visible = false; mc.num._alpha = 0; //MCを時間差で任意の位置に表示 var t=0; this.onEnterFrame = function(){ t++; if(t==25){ mc1._visible = true; mc1.onEnterFrame = function(){ this._y = 50; } } if(t==50){ mc2._visible = true; mc2.onEnterFrame = function(){ this._y = 100; } } if(t==75){ mc3._visible = true; mc3.onEnterFrame = function(){ this._y = 150; } } //以降、mc4、mc5は省略 } --------- --------- mc.num._visible = false; mc.num._alpha = 0; --------- の部分で、デフォルト時はmc1~5を非表示にしているつもりが、 最初から表示されてしまいます。 初心者なので、近いフラッシュを見よう見真似で作成しています。 根本的に記述法を間違えておりましたら、恐れ入りますがご指摘ください。 またもっと効率的な方法がありましたら、ご教授いただければ幸いです。 Flash8.0、ActionScript2.0で制作しています。

    • ベストアンサー
    • Flash
  • onRelease文での動作について・・・。

    ムービークリップをボタンにして、その階層の最初のフレームに this.onRollOver = function() { this.onEnterFrame = this.nextFrame; }; onRelease=function(){ var num:Number=0 onEnterFrame=function(){ trace("LOOP num ="+num) num ++ if(num>30){ delete onEnterFrame } } } stop() 最後のフレームに this.onRollOut = function() { this.onEnterFrame = function() { if (this._currentframe > 1) { this.prevFrame(); } }; }; とした場合について質問です。 ボタン上にカーソルがある場合は30までカウントされます。 しかし、クリック直後にカーソルがボタン上から離れるとカウントが停止します。 ボタンから離れてもカウントを続けるにはどうすればよいでしょうか?? ちなみに、このスクリプトは簡単に流れが分かるように作ったものなのでfor文などではなくonEnterFrame~での対処法を教えて下さい。 実際にはonEnterFrame以下はもっと長くなっているので・・・。 どうかお願いしますっ!!! m(_ _)m

    • ベストアンサー
    • Flash
  • ActionScript2.0のイベントについて

    親ムービークリップに配置した子ムービークリップのイベントが実行されなくて困っています。 親ムービークリップ自体には下記のイベントを設定しています。親ムービークリップはattachMovieで動的に配置しています。 onRollOver・・・onEnterFrameを設定 onRollOut・・・onEnterFrameを削除 子ムービークリップを配置して子ムービークリックにイベントを設定しました。onEnterFrameをは実行されますが、onReleaseが実行されず困っています。 function Parent() { this.onRollOver = function() { this.onEnterFrame = function(){・・・} } this.onRollOut = function(){ delete this.onEnterFrame; } this["child_mc"].onRelease = function() { trace('a') // 実行されない } this["child_mc"].onEnterFrame = function() { trace('b') // 実行される } } ・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・ _root.attachMovie("Parent", "parent_mc", _root.getNextHighestDepth(), new Parent()); 子ムービークリップはオーサリングで静的にParentに配置し、プロパティでchild_mcと設定しています。 onReleaseは実行できず、そこで止まっています。 なんでも良いので教えてください。

    • ベストアンサー
    • Flash
  • movie clipのインスタンス名を変数にし文字列+数字を代入し.g

    movie clipのインスタンス名を変数にし文字列+数字を代入し.gotoAndStopを行ったが動作しない。 Flash 初心者です。 「なぞ」にはまり込んでしまいました。よろしくお願いします。 作っているのは、 丸いボタンをクリックすると、下にある白い札の色が変わるインタラクションです。 丸いボタンは2個あり、四角の札も2個あります。 クリックするボタンに対応した札が色が変わり、その札以外は白になります。 初め次のようなアクションスクリプトを書いて、うまく動かすことができました。 var onMapButton_num = 0; onEnterFrame = function () {      if (onMapButton_num == 0) { spotName1_mc.gotoAndStop("white"); spotName2_mc.gotoAndStop("white"); } else if (onMapButton_num == 1) { spotName1_mc.gotoAndStop("orange"); spotName2_mc.gotoAndStop("white"); } else if (onMapButton_num == 2) { spotName1_mc.gotoAndStop("white"); spotName2_mc.gotoAndStop("orange"); } }; onMapButton1_mc.onRelease = function() { onMapButton_num = 1; }; onMapButton2_mc.onRelease = function() { onMapButton_num = 2; }; ボタンを増やしたいので、記述を短するために次のように変えてみました。 (spotNameという変数を作りました) var onMapButton_num = 0; onEnterFrame = function () { var spotName = "spotName" + onMapButton_num + "_mc"; /* spotName */ if (onMapButton_num == 0) { spotName1_mc.gotoAndStop("white"); spotName2_mc.gotoAndStop("white"); } else if (onMapButton_num == 1) { spotName.gotoAndStop("orange"); /* spotName の使用*/ spotName2_mc.gotoAndStop("white"); } else if (onMapButton_num == 2) { spotName.gotoAndStop("white"); /* spotName の使用*/ spotName2_mc.gotoAndStop("orange"); } }; onMapButton1_mc.onRelease = function() { onMapButton_num = 1; }; onMapButton2_mc.onRelease = function() { onMapButton_num = 2; }; 結果、1つめのボタンをクリックしても、札の色が変わらなくなりました。 変数の使い方に問題があるのでしょうか? よろしくお願いします!

    • ベストアンサー
    • Flash
  • 3つのムービークリップ再生・巻き戻しの順番制御

    初めまして。 初心者につき、基本的な事だとは思うのですが、調べても分からなかったため、こちらで質問させて頂きたいと思います。 3つのムービークリップ(a_mc,b_mc,c_mc)【フレーム数30】と、 各々を再生させるためのボタン(A,B,C)を使って、 b_mcを再生中にAのボタンを押すと、b_mcを巻き戻した後で、 a_mcを再生するといった感じで3すくみのような状態にしたいのですが、b_mcの巻き戻しとa_mcの再生が同時に行われてしまいます。 現在のActionScriptは以下のようなものなのですが、どなたかご教授願えませんでしょうか? よろしくお願いいたします。 ボタンAのスクリプト on (release) { //Cの巻き戻し _root.c_mc.onEnterFrame = function() { if (this._currentframe>=2) { this.prevFrame();} else {delete this.onEnterFrame} } //Bの巻き戻し _root.b_mc.onEnterFrame = function() { if (this._currentframe>=2) { this.prevFrame();} else {delete this.onEnterFrame} } //BでもCでもないときの判別式? //Aの再生 _root.a_mc.onEnterFrame = function() { if (this._currentframe<=29){ this.gotoAndPlay(this._currentframe); delete this.onEnterFrame} } }

    • ベストアンサー
    • Flash
  • AS2.0 ボタンを押し続けた際の処理

    ボタンを押し続けた際に~する、という処理を実現するため 次のようなスクリプトを作成しました。 //ここから //1フレーム目 mc_hoge.onPress = function() { this.onEnterFrame = function(){ cnt++; if(cnt>=max_cnt) delete this.onEnterFrame; } } mc_hoge.onRelease = function() { delete this.onEnterFrame; if(cnt>=max_cnt) trace("~秒押し続けた際の処理"); else trace("普通のクリックをした際の処理"); cnt = 0; } max_cnt=24;//カウントの上限を設定します。適当に24としました。 cnt = 0;//カウント用変数を初期化 //ここまで onEnterFrameでボタンが押されている間、カウントを続けます。 (ボタンを離すか、上限に達したらonEnterFrrameを削除しています) そのカウントした値でボタンを押し続けたかを判定しています。 ここで、この方法よりも動作に負荷がかからないようにするためには このスクリプトをどのように書き換えればよいでしょうか。

  • 条件式の中に入れるとムービークリップが動作しない。

    条件式の中に入れるとムービークリップが動作しない。 またまた、悩みにはまってしまいました。 初期状態で、ボタンのムービークリップを全て、ラベルreadyの静止画像に設定し、 クリックされたときに、そのボタンのラベルhitに移動して、 そこに設定されたムービークリップの動作をさせようとしています。 以下のようなアクションスプリクトを書きましたが、 hitに移動するものの、hitに設定したムービークリップの、 1フレーム目の静止画像しか表示されません。 試しに6行目の_root[buttonName].gotoAndStop("ready"); のreadyをhitに変えると、hitラベルのムービークリップが動作します。 原因は何なのでしょうか??? ////////////////////////////////////////////////////////// var onMapButton_num = 0; onEnterFrame = function () { var buttonName = "onMapButton" + onMapButton_num + "_mc"; for ( var i:Number = 1; i < 6; i++) { // 初期設定 buttonName = "onMapButton" + i + "_mc"; _root[buttonName].gotoAndStop("ready"); //ボタンをすべて ready に } for ( var i:Number = 1; i < 6; i++) { // アクション if ( onMapButton_num== i ) { // ボタンが押された場合 buttonName = "onMapButton" + i + "_mc"; _root[buttonName].gotoAndStop("hit");     // ヒットしたボタンを hit に } } }; // ボタン(1~5)のアクションと 番号の取得 ////////////////////////////////// onMapButton1_mc.onRelease = function() { onMapButton_num = 1; }; onMapButton2_mc.onRelease = function() { onMapButton_num = 2; }; onMapButton3_mc.onRelease = function() { onMapButton_num = 3; }; onMapButton4_mc.onRelease = function() { onMapButton_num = 4; }; onMapButton5_mc.onRelease = function() { onMapButton_num = 5; }; stop();

  • インスタンス名の変更mcどうしのhittest

    お世話になります。Flash,actionscriptの初心者です。 現在actionscript2.0でちょっとしたFlashコンテンツを作っているのですが、解決できない ことがあり、ぜひお知恵を拝借できればと思います。 詳しくは添付図をご覧いただきたいのですが、 A1_mcとB1_mcのムービークリップをhittestで衝突判定させ、 B1_mcは見えないようにし、 A1_mcはgotoAndPlay(2)で2フレーム目にします(☆の絵)。 同時にthis._name="C1_mc"でインスタンス名を変更しました。 (ここまでは大丈夫で、trace(this._name)でも変更が確認できる。) 同じようにA2、B2、C2も設定しました。 そして、姿(○⇒☆)とインスタンス名(A⇒C)と変わった C1_mcとC2_mcをhittestで衝突判定させてD_mc(■)を見えるようにしたいのですが、 何も起きず、hittestが発動していないのではと思ってしまいます。 説明がわかりにくいと思うのですが、インスタンス名を変更した物どうしのhittestを うまく発動させるにはどうしたらよいか、教えていただきたいのです。 にわか知識のためFlashやactionscriptの根本的な問題を理解できてなさそうです・・・。 ちなみに何がやりたいかというと、○と○、○と☆ではお互いに反応しないが、 ○と◇が合体して☆になったもの同士(☆と☆)が接触すると、反応して■が出現する・・・ そんなFlashを作りたいのです。 自分の現状のやり方以外でこれが実現できるのなら、それでも大歓迎です。 長文になりましたが、ぜひともよろしくお願いいたします。 <参考・・自分の組んだAS> A1_mc.onEnterFrame = function() { if (this.hitTest(_root.B1_mc))     { _root.B1_mc.gotoAndPlay(2); //2フレーム目(空のキーフレーム)にとび、B1を消す this.gotoAndPlay(2);  //○⇒☆(2フレーム目)に姿を変える this._name="C1_mc"; //インスタンス名をA1_mcからC1_mcに変える     trace(this._name); //インスタンス名の変更を確認する。 delete this.onEnterFrame;     } else{ } }; A2_mc.onEnterFrame = function() { if (this.hitTest(_root.B2_mc))     { _root.B2_mc.gotoAndPlay(2); //2フレーム目(空のキーフレーム)にとび、B1を消す this.gotoAndPlay(2);  //○⇒☆(2フレーム目)に姿を変える this._name="C2_mc"; //インスタンス名をA2_mcからC2_mcに変える     trace(this._name); //インスタンス名の変更を確認する。 delete this.onEnterFrame;     } else{ } }; C1_mc.onEnterFrame = function() { if (this.hitTest(_root.C2_mc))     {     this.visible = false ; //姿を消す _root.C1_mc.visible = false; _root.D_mc.gotoAndPlay(2); //D_mcの出現(D_mcの1フレーム目は透明で見えなくしている。2フレーム目からアニメーションさせたいのでvisibleは使わない)     delete this.onEnterFrame; }   else{ } };

    • ベストアンサー
    • Flash
  • JavascriptのFunctionの構文について

    function定義で"a=function() {...}();"と書ある場合の、"}();"の意味が分かりません。 どなたか、この構文の意味をご存知であれば教えてください。 例) counter = function() { var count; return {init: function() {count =0;},count:{count++;}}; }(); ↑この部分です。 "function () {......};"の構文は私も良く使用するので理解しているつもりです。 初歩的な問題かも知れませんが宜しくお願いします。

専門家に質問してみよう