What needs to be done to get the correct sequence of numbers from 0 to 4 inclusive? for(var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, 0) } Solutions: Third parameter i in setTimeout as argument for handler for(var i = 0; i < 5; i++) { setTimeout(function(i) { console.log(i) }, i*1000, i) } IIFE in setTimeout for(var i = 0; i < 5; i++) { setTimeout((function(z) { return function() { console.log(z) } })(i), i * 1000) } IIFE out of setTimeout for(var i = 0; i < 5; i++) { (function(z) { setTimeout(function(i) { console.log(z) }, i*1000) })(i) } With help of bind for(var i = 0; i < 5; i++) { setTimeout((function(i) { console.log(i) }).bind(null, i), i*1000) } ES2015 approach (block scoped variable with let keyword ) for(let i = 0; i < 5; i++) { setTimeout(function() { console.log(i) }, i*1000) }