why is IIFE needed to create a new scope?
From You Don't Know JS : for (var i=1; i<=5; i++) { setTimeout( function timer(){ console.log( i ); }, i*1000 ); } gives 6 6 6 6 6 but using an IIFE like so for (var i=1; i<=5; i++) { (function(){ var j = i; setTimeout( function timer(){ console.log( j ); }, j*1000 ); })(); } gives 1 2 3 4 5 My question: why doesn't for (var i=1; i<=5; i++) { setTimeout( function timer(){ var j = i; console.log( j ); }, i*1000 ); } or for (var i=1; i<=5; i++) { function timer() { var j = i; console.log(j); } setTimeout(timer, i*1000 ); } work like the IIFE example? It seems to me they both have a function