javascript for loop unexpected behaviour
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:
- The
initialExpressionis evaluated at the start - The
conditionis evaluated, if it evaluates tofalse, the loop ends, if it evaluates totrue, the statement is evaluated. - Evaluate the statement.
- The
incrementExpressionis 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);
}
That's because your console.log instruction is outside of the for loop.
This will print it up to two as you intended:
for (i=0; i<=2; i++) {
console.log(i);
}
For loops will only repeatedly execute what you type within the parentheses. That's why console.log was executed only once.
Source: http://www.kompulsa.com/a-guide-to-for-loops-in-javascript/
加载中,请稍侯......
精彩评论