オブジェクトをキーとして使用してハッシュをロードしようとすると、予期しない動作が発生します。つまり、後でデータを取得するとき、ハッシュは常に最後に使用されたキーを参照します。これはクロージャーの動作によるものだと思いますが、これを防ぐために必要なことを行ったと思いました。
var hash = {};
var arry = [];
var list = [{val:"a"},{val:"b"},{val:"c"}];
var len = list.length;
dump("load : \n");
for (var i=0;i<len;i++) {
let pos = i;
let obj = list[pos];
hash[obj] = obj.val;
arry.push(obj);
dump(" "+obj.val+" "+hash[obj]+"\n");
}
dump("retrieve : \n");
for (var i=0;i<len;i++) {
let pos = i;
let obj = list[pos];
dump(" "+obj.val+" "+arry[pos].val+" "+hash[obj]+"\n");
}
出力は次のとおりです。
load :
a a
b b
c c
retrieve :
a a c
b b c
c c c
let を使用して反復オブジェクトのスコープを上げることでこれを防止しようとして、意図的に船外に出ましたが、まだ何かが欠けているようです。この背後にある理由と、Javascript を使用してそれを防ぐ方法を理解したいと思います。