A common pitfall with JavaScript closures is running setTimeout() from a for loop, and expecting the counter to be passed with different values at each iteration, while in practice it gets assigned the last value before the setTimeout() functions execute:
for (i = 0; i < 10; i++) {
  setTimeout(function () {
    console.log(i)
  }, 100);
}  // => prints "10" 10 timesOne solution to this is to have an Immediately Invoked Function Expression:
for (i = 0; i < 10; i++)
  (function(j) {
    setTimeout(function foo() {
      console.log(j)
    }, 100);
  })(i);  // prints 0, 1, 2, 3, 4, 5, 6, 7, 8, 9Another is to pass an extra callback argument to setTimeout() (which doesn't work in IE<9):
for (i = 0; i < 10; i++) {
  setTimeout(function foo(n) {
    console.log(n)
  }, 100, i);
}But why does the following, simplest, code, produce the same result (0, 1, 2, ... 9)?
for (var i = 0; i < 10; i++)
  setTimeout(console.log(i), 100); 
     
     
    