Search code examples
javascriptclosuresvarlet

let vs var in javascript


I understand that let has block scope and var has functional scope. But I do not understand in this case, how using let will solve the problem

const arr = [1,2,3,4];
for (var i = 0; i < arr.length; i++) {
setTimeout(function() {
   console.log(arr[i]) 
}, 1000);
} // Prints undefined 5 times

const arr = [1,2,3,4];
for (let i = 0; i < arr.length; i++) {
setTimeout(function() {
   console.log(arr[i]) 
}, 1000);
} // Prints all the values correctly

Solution

  • First of all, the output will be four times and not five times(as mentioned in your comment). I pasted your code in Babel REPL and this is what I got,

    "use strict";
    
    var arr = [1, 2, 3, 4];
    
    var _loop = function _loop(i) {
    setTimeout(function () {
       console.log(arr[i]);
    }, 1000);
    };
    
    for (var i = 0; i < arr.length; i++) {
    _loop(i);
    }
    

    Do you see how let works internally now? :-)