Aadit had the right idea. I needed to start multiple timeouts within a loop, and they all ended up with the variable set to the same value.
Here is a fiddle illustrating why the only method that works well asynchronously is Aadit's.
http://jsfiddle.net/85fmwew4/
for(i=0;i<10;i++){
setTimeout(function(){bad(i)}, 1000) // bad for async
setTimeout(good, 1000, i) // good for async
}