forとかvarとか使っているとC#とJavaScriptのソースがそっくりに見えるけれど、落とし穴もあるってことですね。
C#: §
using System;
using System.Collections.Generic;
class Program
{
static void Main(string[] args)
{
var l = new List<Func<int>>();
for (int i = 0; i < 2; i++)
{
int i0 = i;
l.Add(() => i0);
}
foreach (var item in l) Console.WriteLine(item());
}
}
実行結果:
JavaScriptその1: §
<!DOCTYPE html>
<html>
<head>
<title></title>
<script>
var l = new Array();
for (var i = 0; i < 2; i++) {
var i0 = i;
l.push(function(){return i0;});
}
for (var i = 0; i < 2; i++) alert(l[i]());
</script>
</head>
<body>
</body>
</html>
実行結果:
というわけで、結果が違いますね。
JavaScriptで結果を同じにするために、こんな感じに書き換えてみました。
JavaScriptその2: (最初のforループだけ差し替え) §
for (var i = 0; i < 2; i++) {
(function () {
var i0 = i;
l.push(function () { return i0; });
} ());
}
実行結果:
感想 §
他人のソースで(function () {……} ());なんていうコードを見たことがあって、なんだろうねーと思っていたら自分でも書いてしまった……。どんどんJavaScriptの深みにはまっていく自分が怖い。(Visual C#のMVPなのに!)