- ベストアンサー
【javascript 文法】値渡し?参照渡し?
以下実行すると、AAAをクリックしてもBBBをクリックしても「BBB」とアラートされます。 <html> <head> <script type="text/javascript" src="prototype.js"></script> </head> <body> <script type="text/javascript"><!-- var gDown= false; var div = document.createElement('div'); div.id = 'AAA'; div.innerHTML = 'AAA'; document.body.appendChild(div); Event.observe(div, 'mousedown',function(){ gDown = div; }); var div = document.createElement('div'); div.id = 'BBB'; div.innerHTML = 'BBB'; document.body.appendChild(div); Event.observe(div, 'mousedown',function(){ gDown = div; }); Event.observe(document, 'mouseup',function(){ alert(gDown.id); gDown=false; }); //--></script> </body> </html> javascriptって値渡しだと思っていたので、期待した動作と異なります。参照渡しだと考えると納得できるのですが、javascriptって 参照渡し?それとも値渡し? と混乱しています。 この辺のところを、教えてください。お願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
オブジェクト(関数、配列etc..)の場合は参照渡しとなります。 observeの第三引数では関数オブジェクトを渡しているのでコードの実行は実際にイベントが発生した時に行われます。
その他の回答 (3)
- steel_gray
- ベストアンサー率66% (1052/1578)
連投失礼。 ついでなのでEvent.elementを使った実例。 <html> <head> <script type="text/javascript" src="prototype.js"></script> </head> <body> <script type="text/javascript"><!-- var gDown = false; var Ary = ['AAA','BBB']; for(var i=0;Ary[i];i++){ var div = document.createElement('div'); div.id = Ary[i]; div.innerHTML = Ary[i]; document.body.appendChild(div); Event.observe(div, 'mousedown',function(event){ gDown = Event.element(event); // ← ※ココ }); } Event.observe(document, 'mouseup',function(){ alert(gDown.id); gDown=false; }); //--></script> </body> </html>
- steel_gray
- ベストアンサー率66% (1052/1578)
>使い捨てられていく変数を多数用意する ちょっとおっしゃりたい事を理解してませんので見当違いかもしれませんが、 とりあえずサンプルのようなコードなら「値」を設定するのではなく、「イベント」オブジェクトからイベント発生オブジェクトを得るのが常套手段だと思います。 イベントオブジェクトはブラウザによって違いがあってやや面倒です。 http://wiki.bit-hive.com/tomizoo/pg/JavaScript%20%A5%AF%A5%ED%A5%B9%A5%D6%A5%E9%A5%A6%A5%B6%A4%CB%B4%D8%A4%B9%A4%EB%A5%E1%A5%E2 ただ、prototype.jsを使っているなら、Event.elemntでシンプルに取得できます。 http://www.s2factory.co.jp/tech/prototype/prototype.js.html#Reference.Extensions.Event
お礼
steel_grayさん すごくイイアドバイスありがとうございました。 おかげで簡素に書く事ができました。
- Hardking
- ベストアンサー率45% (73/160)
>javascriptって値渡し 値渡しのみとは限らず、参照渡しもあります。 これはファンクションプやイベントプロシジャーへの パラメーター受け渡し方法である。 今回の場合、グローバル変数diを重複宣言しており 後者のBBBの設定がAAAを打ち消している為ではないか思います。 変数名の重複を避けて、再試行してみてはどうでしょう。
お礼
Hardkingさんご回答ありがとうございます。 javascriptは値渡しと参照渡し混在なんですね。 アラウンドとして変数名の重複を避れば良いのは、 色々試した結果、わかってました。 でも、使い捨てられていく変数を多数用意するのって、微妙ですよね。
お礼
steel_grayさん ご回答ありがとうございます。 実際にイベントが発生した時に行われてるってのがポイントですね。