// using IIFE (immediately invoked function) // with delay for (var i=0; i<10; ++i) { (function(j) { setTimeout(function() { console.log(j); }, 1000); })(i); } // without delay for (var i=0; i<10; ++i) { setTimeout((function(i) { console.log(i); })(i), 1000) } // wrap in a function for (var i = 0; i < 10; i++) { function timer(j) { setTimeout(function() { console.log(j); }, j); }; timer(i); } // ES6, use let instead of var for (let i=0; i<10; ++i) { setTimeout(function() { console.log(i); }, 1000); }