Про let слышал, но нужно сделать без него
Не нужно, но варианты есть такие:
for (var i = 0; i < 10; i++) {
(function(i) {
setTimeout(function() {
console.log(i);
}, 1000);
})(i);
}
for (var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(+this);
}.bind(i), 1000);
}
for (var i = 0; i < 10; i++) {
setTimeout(console.log, 1000, i);
}
for (var i = 0; i < 10; i++) {
setTimeout(new Function(`console.log(${i})`), 1000);
}
for (var i = 0; i < 10; i++) {
setTimeout(function() {
console.log(10 - i--);
}, 1000);
}