[解決方法]
関数の引数は、var変数と同様に処理されます。
関数側での値の設定方法、呼出元での引数の定義方法により下記の結果となります。
=== 例1 ==============================
funcA( param ){
param = "xyz"; ・・・・(a)
}
var data = new String( "abc" );
funcA( data );
print( "data=", data );
/* 結果 -- data= abc */
--- 例1(var変数の例) ---
var data = new String( "abc" );
var param = data;
param = "xyz";
print( "data=", data, " param=", param, "\n" );
/* 結果 -- data= abc param= xyz */
(a)の処理によりparamに格納されたオブジェクトのリファレンスが文字列定数で書き換えられ、dataの値は変化しません。
=== 例2 ==============================
funcB( param ){
param.Value = "xyz"; ・・・(b)
}
var data = new String( "abc" );
funcB( data );
print( "data=", data );
/* 結果 -- data= xyz */
--- 例2(var変数の例) ---
var data = new String( "abc" );
var param = data;
param.Value = "xyz";
print( "data=", data, " param=", param, "\n" );
/* 結果 -- data= xyz param= xyz */
(b)の処理により、paramが指すオブジェクトのValueプロパティを設定することで、
dataの値は変化します。
=== 例3 ==============================
funcB( param ){
param.Value = "xyz"; ・・・(c)
}
var data = "abc";
funcB( data );
print( "data=", data );
/* 結果 -- data= abc */
--- 例3(var変数の例) ---
var data = "abc";
var param = data;
param.Value = "xyz"; ・・・(d)
print( "data=", data, " param=", param, "\n" );
/* 結果 -- data= abc param= abc */
引数に文字列定数を指定した場合、(c)の処理により、String型の一時オブジェクトが生成され、その一時オブジェクトのValueプロパティが書き換えられるため、dataの値は変化しません。
また、(d)においてもparamの値は変化しません。
下記は、(d)の処理を表した例です。
var data = "abc";
var param = data;
/* String型の一時オブジェクトが生成される */
var _temp = new String( param );
/* 一時オブジェクトのValueプロパティが書き換えられる */
_temp.Value = "xyz";
/* data、paramの値は変化しない */
print( "data=", data, " param=", param, "\n" );
/* 結果 -- data= abc param= abc */
|