次のHTML/Javascriptコードのスニペットを確認してください。
<html>
<head>
<script type="text/javascript">
var alerts = [];
for(var i = 0; i < 3; i++) {
alerts.push(function() { document.write(i + ', '); });
}
for (var j = 0; j < 3; j++) {
(alerts[j])();
}
for (var i = 0; i < 3; i++) {
(alerts[i])();
}
</script>
</head><body></body></html>
これは以下を出力します:
3, 3, 3, 0, 1, 2
これは私が期待していたものではありません-私は出力を期待していました0, 1, 2, 0, 1, 2,
私は(誤って)配列にプッシュされている無名関数がクロージャーとして動作しi
、関数の作成時に割り当てられた値をキャプチャすると想定しましたが、実際にi
はグローバル変数として動作しているように見えます。
このコード例のスコープに何が起こっているのi
か、そして無名関数がその値をキャプチャしていない理由を誰かが説明できますか?