0
<script type="text/javascript">   
function buildList(list) {
  var result = [];
  for (var i = 0; i < list.length; i++) {
    var item = 'item' + list[i];
    result.push( function() {console.log(item + ' ' + list[i])} );
  }
  return result;
}

function testList() {
  var fnlist = buildList([1,2,3]);
  fnlist[0]();
}
testList(); 
</script>

質問:

IN firefox->console に表示されますがitem3 undefined、なぜですか?

4

2 に答える 2

0

これは、ステートメントの実行時にクロージャ参照の評価が行われるためです。(item + ' ' + list[i] + ' ' + iその時点までに の値はi4 になり、これlist[4]は undefined を返します。

実行シーケンスはi、ループ内でクロージャー変数を作成しているため、プッシュされたすべての関数参照resultは の同じインスタンスを参照iし、変数に加えられた変更は、いつ追加されたかに関係なく、追加された各関数に反映されます。 .

このような場合の解決策は、iife を使用してループ ステートメント内にプライベート クロージャーを作成することです。

デモ:フィドル

于 2013-07-03T04:02:21.307 に答える