Javascriptで引数を参照渡しを行いたいのですが空で返ってきます。
どうすればよいのでしょうか?
参照渡しの引数がうまくいかない場合は戻り値を2つ返す方法と受け取る記述の仕方など知りたいです。
function test(indat, outdat, retval){
outdat = [];
for (var i=0; i<indat.length; i++){
outdat[i] = indat[i];
}
retval = 123;
}
var indat = new Array();
var outdat= new Array();
var retval = "";
indat[0] = 'A';
indat[1] = 'B';
indat[2] = 'C';
test(indat, outdat, retval);
for (var i=0; i<outdat.length; i++){
alert(outdat[i]);
}
alert('retval=[' + retval + ']');
No.1ベストアンサー
- 回答日時:
JavaScriptは、
基本データ型(number、boolean、string、undefined)は値渡し、
オブジェクト型(Object、Arrayなど)は参照渡しです。
なので、引数をArrayにでもすれば参照渡しができます。
提示コードのoutdatでうまくいっていないのは、
> outdat = [];
この行が原因です。
これは
> outdat = new Array();
と書いたのと同じことですから、
この行でoutdatの参照先自体が新たなArrayオブジェクトに対するものに書き換わってしまいます。
(なので正確には、参照が値渡しされるといった方がいいかもしれない。)
そのため、以降のoutdatへの変更は、
もともと指していた関数外で作成されたArrayへのものではなくなり反映されなくなっています。
> 戻り値を2つ返す方法
ArrayやObjectをreturnする方法があります。
return ['A', 'B']; //Arrayをreturn
とか
return { 'valA': 'A', 'valB': 'B' }; //Objectをreturn
のように。
参考URL:http://okwave.jp/qa2440094.html
No.3
- 回答日時:
<script type="text/javascript">
// 属性データ保存用エリア定義
function Datas(){
this.indat = new Array();
this.outdat = new Array();
this.retval = "";
}
// テストメソッド
function test(indats){
outdat = [];
for (var i=0; i<indats.indat.length; i++){
outdat[i] = indats.indat[i];
alert('indat[i]=' + outdat[i]);
}
retval = 123;
alert('retval=[' + retval + ']');
indats.outdat = this.outdat;
indats.retval = this.retval;
}
// メイン(?)処理
DATAS = new Datas(); // ← 属性データ保存用エリアのインスタンス生成
DATAS.indat[0] = 'A';
DATAS.indat[1] = 'B';
DATAS.indat[2] = 'C';
test(DATAS);
for (var i=0; i<DATAS.outdat.length; i++){
alert(DATAS.outdat[i]);
}
alert('retval=[' + DATAS.retval + ']');
</script>
※こんなところはJAVAそっくりなんだよなあ。。。
参照渡しにするには、クラスを作ってあげればよろし。
No.2
- 回答日時:
JavaScriptはCと違って 参照渡しというのが無い
でも配列やらをそのまんま渡せる
件のscriptではfunctionでローカル変数としてindat,autdat,retvalを宣言してしまっている(「function test(indat, outdat, retval)」の部分)ので呼び元の値を扱えない
ソースをそのまま使いたいなら「function test()」とすべき。
呼び元も「test();」で良い。
返値として
return [indat,outdat,retval];
のような事はできるが呼び元でそれを分解しなければならないので手間
r = test();
indat = r[0];
outdat = r[1];
retval = r[2];
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- JavaScript javascript作成してます。ラジオボタンで判定するコードを書いてます。 1 2023/07/18 11:03
- JavaScript 画像の表示位置 3 2022/12/23 08:25
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- JavaScript ソースコードのいじる場所が分かりません。 1 2022/12/23 02:06
- JavaScript gasについて 1 2022/05/31 21:51
- JavaScript JAVASCRIPT 2 2022/04/15 15:10
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- JavaScript javascriptで変数を組み込みたい 2 2023/01/13 09:52
- JavaScript 定積分の近似値を計算する関数composite_newton_cotesをつくりたい 1 2023/01/18 14:09
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/2】 国民的アニメ『サザエさん』が打ち切りになった理由を教えてください
- ・ちょっと先の未来クイズ第5問
- ・【お題】ヒーローの謝罪会見
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・【大喜利】【投稿~11/22】このサンタクロースは偽物だと気付いた理由とは?
- ・お風呂の温度、何℃にしてますか?
- ・とっておきの「まかない飯」を教えて下さい!
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・いけず言葉しりとり
- ・土曜の昼、学校帰りの昼メシの思い出
- ・忘れられない激○○料理
- ・あなたにとってのゴールデンタイムはいつですか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
idを使わずにonclickで自身の要...
-
関数でy=g(x)のgとは何の略です...
-
クリックすると上に開くアコー...
-
javascript(jQuery)でセル内...
-
処理前の「お待ちください」
-
jQueryが読み込めない
-
functionから別のfunctionを実...
-
関数名をテキストから読み込む...
-
XMLHttpRequestでキャッシュを...
-
同じIDで定義した要素の配列を...
-
C#OpenCv V4にのエラーに関する...
-
Latexに関する質問です。
-
今日からnヶ月後(前)
-
ボタンをクリックすると数が増...
-
外部ファイル読み込みと繰り返...
-
iframeのソースを取得したい
-
翌月を取得するGASが分かりません
-
<a>タグのテキストを取得
-
ASP.NETのコントロールの値をJa...
-
ジェネレーターの作り方
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
functionから別のfunctionを実...
-
関数でy=g(x)のgとは何の略です...
-
idを使わずにonclickで自身の要...
-
jQueryの :not() .not() が有効...
-
関数名をテキストから読み込む...
-
XMLHttpRequestでキャッシュを...
-
javascript(jQuery)でセル内...
-
要素名がスペースを含む場合のj...
-
jslintのエラーについて質問
-
クリックすると上に開くアコー...
-
Javascriptの丸括弧の意味
-
thisとvar ?
-
jqueryの変数を関数の外に出す方法
-
jQueryでzipを解凍読み込みする...
-
マウスをのせてながら、2秒後に...
-
phpでの文字の点滅表示
-
function(e)の意味を教えてくだ...
-
drawImageの描画順序の指定につ...
-
ページ内に複数表がある場合のT...
-
XMLHttpRequestオブジェクトが...
おすすめ情報