
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
SubWindowを閉じる時に処理する...
-
クリックすると上に開くアコー...
-
XMLHttpRequestでキャッシュを...
-
jQueryのイベントに引数を渡したい
-
drawImageの描画順序の指定につ...
-
Ajaxでデータベース(PostgreSQL)
-
jQueryの :not() .not() が有効...
-
idを使わずにonclickで自身の要...
-
同じIDで定義した要素の配列を...
-
ActiveXobjectが作成できない
-
google apps scriptの終了のさせ方
-
ボタンをクリックすると数が増...
-
雪を降らせるみたいな、ゆらゆ...
-
ASP.NET MVCでObjectをjsに渡す
-
ラジオボタンでreadonlyの切替え
-
C#OpenCv V4にのエラーに関する...
-
var_dumpのdump意味はを知りた...
-
Latexに関する質問です。
-
javascriptの基本的なことだと...
-
同じ型【ハイフンと数字】だけ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
functionから別のfunctionを実...
-
idを使わずにonclickで自身の要...
-
関数でy=g(x)のgとは何の略です...
-
クリックすると上に開くアコー...
-
Matlabで自作関数をオーバーロード
-
XMLHttpRequestでキャッシュを...
-
javascriptのenchantの打ちミス
-
ASP 最終日の表示
-
javascriptのレキシカルスコー...
-
jQueryでのレスポンシブが綺麗...
-
jQueryを利用したアコーディオ...
-
イベントハンドラの関数の引数...
-
getElementByIdを使用したグロ...
-
関数名をテキストから読み込む...
-
delphi6を使っています。
-
JavaScript 宣言 について
-
Ajaxでデータベース(PostgreSQL)
-
functionはhtmlやjsに2度使えま...
-
Javascriptの丸括弧の意味
-
JavaScript/jQuery で元画像フ...
おすすめ情報