let がブロックを作ってくれない?

Mozilla JavaScriptの話

var o = {};
for each (let val in ["a","b","c"]) {
  o.__defineGetter__(val, function (){ return val; });
}

結果

o.a; // "c"
o.b: // "c"
o.c; // "c"

になってしまう。letで書いているからいけると思ったのに。

var o = {};
for each (let val in ["a","b","c"]) {
  let value = val;
  o.__defineGetter__(value, function (){ return value; });
}

なら意図通りに"a","b","c"が得られる。

などとTwitterで呟いたら

と助け舟が。バグみたい。仕様みたい。詳しくはコメント欄参照で

見事にはめられた。