
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を探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数でy=g(x)のgとは何の略です...
-
idを使わずにonclickで自身の要...
-
JavaScript 宣言 について
-
functionから別のfunctionを実...
-
javascriptのレキシカルスコー...
-
関数名をテキストから読み込む...
-
jQueryを利用したアコーディオ...
-
正規表現で半角数字1桁のみを全...
-
C#テキストボックスの文字を配...
-
特定文字列を消したい
-
JavaScript window.openで開く...
-
コンストラクタでvar ?
-
JavaScriptでセンター表示で行...
-
java keyを配列で表記したい
-
同じIDで定義した要素の配列を...
-
文字列で条件分岐
-
window.openでタイトル名の指定
-
java scriptでの表示件数の制御...
-
popupでテキストフォームに入力...
-
ローカルにあるファイルを検索...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
functionから別のfunctionを実...
-
idを使わずにonclickで自身の要...
-
関数でy=g(x)のgとは何の略です...
-
jQueryの :not() .not() が有効...
-
クリックすると上に開くアコー...
-
JAVAスクリプトで指定時間以降...
-
関数の中の値を取り出したい
-
javascript(jQuery)でセル内...
-
ページ内に複数表がある場合のT...
-
XMLHttpRequestでキャッシュを...
-
jQuery|要素だけを変更できま...
-
jQueryでzipを解凍読み込みする...
-
jslintのエラーについて質問
-
画像がフェードイン・アウトす...
-
変数のスコープの問題?
-
【javascript 】addEventListen...
-
チェックBOX入力後、ある時間に...
-
roundupについて教えてください。
-
[jQuery] クリックで連番関数を...
-
Matlabで自作関数をオーバーロード
おすすめ情報