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ランキング
-
phpでの文字の点滅表示
-
idを使わずにonclickで自身の要...
-
関数でy=g(x)のgとは何の略です...
-
jquery 複数のメソッド
-
XMLHttpRequestでキャッシュを...
-
関数名をテキストから読み込む...
-
TexでΣの添え字の位置直し
-
google apps scriptの終了のさせ方
-
フォーム入力値の重複チェック
-
任意の座標をクリックさせるには
-
同じ型【ハイフンと数字】だけ...
-
問題はbind の付いたリスナーを...
-
「オブジェクトが必要です。」...
-
ジェネレーターの作り方
-
1から20までの整数から、重複な...
-
innerHTML実行後のイベント
-
フォルダ名をフォルダ内のテキ...
-
javascriptでテーブルに追加し...
-
シンプルなweb版スタンプラリー...
-
FireFoxのjavascriptで自動でキ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
idを使わずにonclickで自身の要...
-
functionから別のfunctionを実...
-
関数でy=g(x)のgとは何の略です...
-
jslintのエラーについて質問
-
クリックすると上に開くアコー...
-
XMLHttpRequestでキャッシュを...
-
ajax反映後のjqueryが動かない
-
要素名がスペースを含む場合のj...
-
function(e)の意味を教えてくだ...
-
jQueryの :not() .not() が有効...
-
jQueryでzipを解凍読み込みする...
-
関数名をテキストから読み込む...
-
getElementByIdを使用したグロ...
-
jqueryuiのdialog
-
drawImageの描画順序の指定につ...
-
addEventListener()でリスナー...
-
jQuery 同じ処理を関数にまとめ...
-
jqueryのグローバル変数とロー...
-
XMLHttpRequestオブジェクトが...
-
javascript(jQuery)でセル内...
おすすめ情報