В первом примере вы просто привязываете эту функцию к событию onclick:
function() {alert(i);};
Это означает, что в событии клика js должен предупредить значение функций i-переменной addlink. Его значение будет 5 из-за цикла for ().
Во втором примере вы создаете функцию, связанную с другой функцией:
function (num) {
return function () { alert(num); };
}
Это означает: если вызов со значением, верните мне функцию, которая будет предупреждать входное значение. Например. вызов function(3)
вернет function() { alert(3) };
.
Вы вызываете эту функцию со значением i на каждой итерации, поэтому вы создаете отдельные функции onclick для каждой ссылки.
Дело в том, что в первом примере ваша функция содержала ссылку на переменную, а во втором - с помощью внешней функции, которую вы заменили ссылкой фактическим значением. Это называется замыканием примерно потому, что вы «закрываете» текущее значение переменной внутри вашей функции, а не сохраняете ссылку на нее.