Note that there are some explanatory texts on larger screens.

plurals
  1. POJavaScript closure inside loops – simple practical example
    text
    copied!<p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code"> <pre class="snippet-code-js lang-js prettyprint-override"><code>var funcs = []; for (var i = 0; i &lt; 3; i++) { // let's create 3 functions funcs[i] = function() { // and store them in funcs console.log("My value: " + i); // each should log its value. }; } for (var j = 0; j &lt; 3; j++) { funcs[j](); // and now let's run each one to see }</code></pre> </div> </div> </p> <p>It outputs this:</p> <blockquote> <p>My value: 3<br> My value: 3<br> My value: 3</p> </blockquote> <p>Whereas I'd like it to output:</p> <blockquote> <p>My value: 0<br> My value: 1<br> My value: 2</p> </blockquote> <hr> <p>The same problem occurs when the delay in running the function is caused by using event listeners:</p> <p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code"> <pre class="snippet-code-js lang-js prettyprint-override"><code>var buttons = document.getElementsByTagName("button"); for (var i = 0; i &lt; buttons.length; i++) { // let's create 3 functions buttons[i].addEventListener("click", function() { // as event listeners console.log("My value: " + i); // each should log its value. }); }</code></pre> <pre class="snippet-code-html lang-html prettyprint-override"><code>&lt;button&gt;0&lt;/button&gt;&lt;br&gt; &lt;button&gt;1&lt;/button&gt;&lt;br&gt; &lt;button&gt;2&lt;/button&gt;</code></pre> </div> </div> </p> <p>… or asynchronous code, e.g. using Promises:</p> <p><div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code"> <pre class="snippet-code-js lang-js prettyprint-override"><code>// Some async wait function const wait = (ms) =&gt; new Promise((resolve, reject) =&gt; setTimeout(resolve, ms)); for(var i = 0; i &lt; 3; i++){ wait(i * 100).then(() =&gt; console.log(i)); // Log `i` as soon as each promise resolves. }</code></pre> </div> </div> </p> <p>What’s the solution to this basic problem?</p>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload