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