Consider such loop:
for(var it = 0; it < 2; it++) { setTimeout(function() { alert(it); }, 1); }
The output is:
=> 2 => 2
I would like it to be: 0, 1. I see two ways to fix it:
Solution # 1.
This one based on the fact that we can pass data to setTimeout.
for(var it = 0; it < 2; it++) { setTimeout(function(data) { alert(data); }, 1, it); }
Solution # 2.
function foo(data) { setTimeout(function() { alert(data); }, 1); } for(var it = 0; it < 2; it++) { foo(it); }
Are there any other alternatives?
A binding in JavaScript is the formal terminology for what a lot of people refer to as a variable. In ES2015+, a variable can be defined with the let keyword, but you can also define constant with the const keyword. A binding could refer to either a variable or a constant.
JavaScript for loop is used to execute code repeatedly. for loop includes three parts: initialization, condition and iteration.
Loops are used in JavaScript to perform repeated tasks based on a condition. Conditions typically return true or false . A loop will continue running until the defined condition returns false .
Not really anything more than the two ways that you have proposed, but here's another
for(var it = 0; it < 2; it++) { (function() { var m = it; setTimeout(function() { alert(m); }, 1); })(); }
Essentially, you need to capture the variable value in a closure. This method uses an immediately invoked anonymous function to capture the outer variable value it
in a local variable m
.
Here's a Working Demo to play with. add /edit to the URL to see the code
With the let keyword you can get around this completely:
for(let it = 0; it < 2; it++) { setTimeout(function() { alert(it); }, 1); }
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