for (var i=0, link; i<5; i++) {
link = document.createElement("a");
link.innerHTML = "Link " + i;
link.onclick = function (num) {
return function () {
alert(num);
};
}(i);
document.body.appendChild(link);
}
ネストされた関数はクロージャーであるため、num
引数への参照がnum
あり、ループの最後の引数は 4 です。最初の要素がクリックされたときに、なぜ 1 を警告するのですか?それは 4 を警告する必要があります。警告する理由は何ですか? 1 ?num
引数を参照していませんか?それとも理由は何ですか?
しかし、ここではケースが異なります:
function foo(x) {
var tmp = 3;
return function (y) {
alert(x + y + (++tmp));
}
}
var bar = foo(2); // bar is now a closure.
bar(10);
上記の関数は 16 をアラートします。これは、bar が直接スコープ内になくても、引き続き argx
およびを参照できるためです。tmp
これは、上記のコードが毎回 4 を警告しない理由よりも、クロージャが引数値への参照も持っていることを証明していますか?