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, тъй като лентата все още може да препраща към arg x
и tmp
, въпреки че вече не е директно в обхвата.
Това доказва, че затварянето също има препратка към стойността на аргументите, отколкото защо горният код не предупреждава 4 всеки път?
1
, когато щракнете върху първия елемент, тъй като предавате аргументаi
на текущата итерация към вътрешнатаonclick
функция, която има аргументnum
. - person Anthony Forloney   schedule 03.04.2013