I have couple of questions about the javascript for loop.
First question:
for (i=0; i<=2; i++) {;}
console.log(i);
Output is 3. Shouldn't it be 2?
Second question:
for (var i=0; i<=2; i++) {
    setTimeout(function(){console.log(i);}, i*1000);
}
Timeouts are set correctly: 0, 1000 and 2000. But the output is 3,3,3 (should be 0, 1, 2). Does this mean the delayed functions are executed after the loop exits? Why?
What should I read to understand all this mysterious javascript stuff?
Thank you.
First question:
No because the i variable is incremented after the last successful iteration, then the condition is checked and it evaluates to false so the loop ends.
The for statement is composed by:
for ([initialExpression]; [condition]; [incrementExpression])
  statement
And it is executed in the following steps:
initialExpression is evaluated at the startcondition is evaluated, if it evaluates to false, the loop ends, if it evaluates to true, the statement is evaluated.incrementExpression is evaluated, go to step 2. Second question:
The function is executed asynchronously after the loop has ended, at this time as you know i contains 3.
The common workaround for this is to use a function to preserve the value of the looping variable on each iteration, for example:
for (var i=0; i<=2; i++) {
  (function (i) {
    setTimeout(function(){console.log(i);}, i*1000);
  })(i);
}
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With