• ベストアンサー

【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って 参照渡し?それとも値渡し? と混乱しています。 この辺のところを、教えてください。お願いいたします。

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

  • ベストアンサー
  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.1

オブジェクト(関数、配列etc..)の場合は参照渡しとなります。 observeの第三引数では関数オブジェクトを渡しているのでコードの実行は実際にイベントが発生した時に行われます。

kingfruits
質問者

お礼

steel_grayさん ご回答ありがとうございます。 実際にイベントが発生した時に行われてるってのがポイントですね。

その他の回答 (3)

  • steel_gray
  • ベストアンサー率66% (1052/1578)
回答No.4

連投失礼。 ついでなので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)
回答No.3

>使い捨てられていく変数を多数用意する ちょっとおっしゃりたい事を理解してませんので見当違いかもしれませんが、 とりあえずサンプルのようなコードなら「値」を設定するのではなく、「イベント」オブジェクトからイベント発生オブジェクトを得るのが常套手段だと思います。 イベントオブジェクトはブラウザによって違いがあってやや面倒です。 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

kingfruits
質問者

お礼

steel_grayさん すごくイイアドバイスありがとうございました。 おかげで簡素に書く事ができました。

  • Hardking
  • ベストアンサー率45% (73/160)
回答No.2

>javascriptって値渡し 値渡しのみとは限らず、参照渡しもあります。 これはファンクションプやイベントプロシジャーへの パラメーター受け渡し方法である。 今回の場合、グローバル変数diを重複宣言しており 後者のBBBの設定がAAAを打ち消している為ではないか思います。 変数名の重複を避けて、再試行してみてはどうでしょう。

kingfruits
質問者

お礼

Hardkingさんご回答ありがとうございます。 javascriptは値渡しと参照渡し混在なんですね。 アラウンドとして変数名の重複を避れば良いのは、 色々試した結果、わかってました。 でも、使い捨てられていく変数を多数用意するのって、微妙ですよね。