IIFE (Immediately Invoked Function Expression)

How does an IIFE solve the closure issue with setTimeout in loops?
for (var i = 0; i < 3; i++) {
  setTimeout(function() {
    console.log(i);
  }, 1000);
}

// Modified version with IIFE
for (var j = 0; j < 3; j++) {
  (function(index) {
    setTimeout(function() {
      console.log(index);
    }, 1000);
  })(j);
}
Next Question (20/25)