このページでは、悪名高いループ問題について説明します。
function addLinks () {
for (var i=0, link; i<5; i++) {
link = document.createElement("a");
link.innerHTML = "Link " + i;
link.onclick = function () {
alert(i);
};
document.body.appendChild(link);
}
}
window.onload = addLinks;
そして1つの解決策:
function addLinks () {
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);
}
}
window.onload = addLinks;
これが私の質問です: 呼び出している関数が親関数の外側 (たとえば、addLinks の外側) にある場合、悪名高いループの問題は依然として問題になりますか?
function addLinks () {
for (var i=0, link; i<5; i++) {
link = document.createElement("a");
link.innerHTML = "Link " + i;
link.onclick = Outside(i);
document.body.appendChild(link);
}
}
function Outside(i) {
alert(i);
};
window.onload = addLinks;
onclick が関数として呼び出されているときに addLinks がまだ作成されていないため、問題が発生するためだと思います。関数を addLInks の外側に配置すると、悪名高いループの問題が軽減されるはずですよね?