{"id":90,"date":"2009-04-02T12:08:04","date_gmt":"2009-04-02T11:08:04","guid":{"rendered":"http:\/\/blogs.igalia.com\/eocanha\/?p=88"},"modified":"2015-11-08T00:21:03","modified_gmt":"2015-11-07T23:21:03","slug":"curiosities-about-using-closures-in-loops-in-javascript","status":"publish","type":"post","link":"https:\/\/eocanha.org\/blog\/2009\/04\/02\/curiosities-about-using-closures-in-loops-in-javascript\/","title":{"rendered":"Curiosities about using closures in loops in Javascript"},"content":{"rendered":"<p>Just execute <a href=\"http:\/\/pastebin.com\/f42abcbbd\">this code<\/a> in your browser and find the ten differences between the two loops:<\/p>\n<div class=\"javascript\" style=\"font-family: monospace\">\n<ol>\n<li class=\"li1\">\n<div class=\"de1\">&lt;html&gt;<\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\">&lt;body&gt;<\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\">&lt;script type=<span class=\"st0\">&quot;application\/javascript;version=1.7&quot;<\/span>&gt;<\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\">&nbsp;<\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\">let funs = <span class=\"br0\">&#123;<\/span><span class=\"br0\">&#125;<\/span>;<\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\">let msg = <span class=\"st0\">&quot;&quot;<\/span>;<\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\">&nbsp;<\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\"><span class=\"kw1\">for<\/span> <span class=\"br0\">&#040;<\/span>let i = <span class=\"nu0\">0<\/span>; i &lt; <span class=\"nu0\">10<\/span>; i++<span class=\"br0\">&#041;<\/span> <span class=\"br0\">&#123;<\/span><\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\">&nbsp; funs<span class=\"br0\">&#091;<\/span>i<span class=\"br0\">&#093;<\/span> = <span class=\"kw2\">function<\/span><span class=\"br0\">&#040;<\/span><span class=\"br0\">&#041;<\/span> <span class=\"br0\">&#123;<\/span><\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\">&nbsp; &nbsp; msg += <span class=\"st0\">&quot;i = &quot;<\/span> + i + <span class=\"st0\">&quot;<span class=\"es0\">n<\/span>&quot;<\/span>;<\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\">&nbsp; <span class=\"br0\">&#125;<\/span><\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\"><span class=\"br0\">&#125;<\/span><\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\">&nbsp;<\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\"><span class=\"kw1\">for<\/span> <span class=\"br0\">&#040;<\/span>let i = <span class=\"nu0\">0<\/span>; i &lt; <span class=\"nu0\">10<\/span>; i++<span class=\"br0\">&#041;<\/span> funs<span class=\"br0\">&#091;<\/span>i<span class=\"br0\">&#093;<\/span><span class=\"br0\">&#040;<\/span><span class=\"br0\">&#041;<\/span>;<\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\">&nbsp;<\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\"><span class=\"kw3\">alert<\/span><span class=\"br0\">&#040;<\/span><span class=\"st0\">&quot;Without redeclaration: <span class=\"es0\">n<\/span>&quot;<\/span>+msg<span class=\"br0\">&#041;<\/span>;<\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\">&nbsp;<\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\">msg = <span class=\"st0\">&quot;&quot;<\/span>;<\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\"><span class=\"kw1\">for<\/span> <span class=\"br0\">&#040;<\/span>let i = <span class=\"nu0\">0<\/span>; i &lt; <span class=\"nu0\">10<\/span>; i++<span class=\"br0\">&#041;<\/span> <span class=\"br0\">&#123;<\/span><\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\">&nbsp; let idx = i;<\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\">&nbsp; funs<span class=\"br0\">&#091;<\/span>i<span class=\"br0\">&#093;<\/span> = <span class=\"kw2\">function<\/span><span class=\"br0\">&#040;<\/span><span class=\"br0\">&#041;<\/span> <span class=\"br0\">&#123;<\/span><\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\">&nbsp; &nbsp; msg += <span class=\"st0\">&quot;i = &quot;<\/span> + idx + <span class=\"st0\">&quot;<span class=\"es0\">n<\/span>&quot;<\/span>;<\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\">&nbsp; <span class=\"br0\">&#125;<\/span><\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\"><span class=\"br0\">&#125;<\/span><\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\">&nbsp;<\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\"><span class=\"kw1\">for<\/span> <span class=\"br0\">&#040;<\/span>let i = <span class=\"nu0\">0<\/span>; i &lt; <span class=\"nu0\">10<\/span>; i++<span class=\"br0\">&#041;<\/span> funs<span class=\"br0\">&#091;<\/span>i<span class=\"br0\">&#093;<\/span><span class=\"br0\">&#040;<\/span><span class=\"br0\">&#041;<\/span>;<\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\">&nbsp;<\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\"><span class=\"kw3\">alert<\/span><span class=\"br0\">&#040;<\/span><span class=\"st0\">&quot;With redeclaration: <span class=\"es0\">n<\/span>&quot;<\/span>+msg<span class=\"br0\">&#041;<\/span>;<\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\">&nbsp;<\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\">&lt;\/script&gt;<\/div>\n<\/li>\n<li class=\"li1\">\n<div class=\"de1\">&lt;\/body&gt;<\/div>\n<\/li>\n<li class=\"li2\">\n<div class=\"de2\">&lt;\/html&gt;<\/div>\n<\/li>\n<\/ol>\n<\/div>\n<p>As you can see, the i variable works as if it was declared outside the loop, so it&#8217;s reused inside it. Thus, if you use it inside a closure, all the closures share the same reference and can see the changes produced during the iterations.<\/p>\n<p>However, in the second loop a new fresh local variable is defined for each iterations, so the values aren&#8217;t shared among the closures.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Just execute this code in your browser and find the ten differences between the two loops: &lt;html&gt; &lt;body&gt; &lt;script type=&quot;application\/javascript;version=1.7&quot;&gt; &nbsp; let funs = &#123;&#125;; let msg = &quot;&quot;; &nbsp; for &#040;let i = 0; i &lt; 10; i++&#041; &#123; &nbsp; funs&#091;i&#093; = function&#040;&#041; &#123; &nbsp; &nbsp; msg += &quot;i = &quot; + i + &hellip; <a href=\"https:\/\/eocanha.org\/blog\/2009\/04\/02\/curiosities-about-using-closures-in-loops-in-javascript\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">Curiosities about using closures in loops in Javascript<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[2],"tags":[],"_links":{"self":[{"href":"https:\/\/eocanha.org\/blog\/wp-json\/wp\/v2\/posts\/90"}],"collection":[{"href":"https:\/\/eocanha.org\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eocanha.org\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eocanha.org\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eocanha.org\/blog\/wp-json\/wp\/v2\/comments?post=90"}],"version-history":[{"count":1,"href":"https:\/\/eocanha.org\/blog\/wp-json\/wp\/v2\/posts\/90\/revisions"}],"predecessor-version":[{"id":417,"href":"https:\/\/eocanha.org\/blog\/wp-json\/wp\/v2\/posts\/90\/revisions\/417"}],"wp:attachment":[{"href":"https:\/\/eocanha.org\/blog\/wp-json\/wp\/v2\/media?parent=90"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eocanha.org\/blog\/wp-json\/wp\/v2\/categories?post=90"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eocanha.org\/blog\/wp-json\/wp\/v2\/tags?post=90"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}