とあるゲームのツールを弄ってて、関数呼び出しすると、変数内容が化けるという現象に遭遇した。
1 2 3 4 5 6 7 8 |
var mm = new Array(); for(var j=0; j<MissionList.length;j++){ for(i=0; i<2; i++){ mm[i] = MissionMember.shift(); } execSingleMission(MissionList[j], mm); } } |
C言語だと、スタックに変数が積まれるから、関数コールしてしまったら呼び出し元は変数に何を代入しようがコール先関数の変数内容は保証されているのだが、どうやら、JavaScript は変数ポインタか何かで参照で呼び出しているようだ。
1 2 3 4 5 6 7 8 9 |
var mm = new Array(); for(var j=0; j<MissionList.length;j++){ var mm[j] = new Array(); for(i=0; i<2; i++){ mm[j][i] = MissionMember.shift(); } execSingleMission(MissionList[j], mm[j]); } } |
と大ループの数だけ、変数を呼び出し元で確保して関数呼び出しを行なうと変数内容が化けなくなった。
シーケンシャルな処理なら、前のコードで問題は無いが、最近は ajax で非同期通信するのが当たり前になっているので、関数呼び出し中に、更に関数呼び出しが起こるなんてザラ。今回の場合、3回関数がコールされ、変数が全て、一番最後にコールした値になってしまった。
C言語みたいにスタックフレーム確保してくれるなら問題起きなかったのに、JavaScriptは面倒くさいのう。