Это фокус с машиной времени. Дело в том, что код не всегда исполняется сверху вниз, как вы его читаете. В момент создания функций переменная меняется на 0,1,2. В момент вызова этих функций она уже равна 3.
Значение i не передается в переменные в момент создания функций, оно читается уже в момент их вызова.
Но вообще и в переменной var, и в let и в const может быть любое значение - примитив, ссылка на объект, на функцию. Разница в основном в областях видимости, и частичной неизменности const. Если вы измение
var i
на
let i
, то в консоль выведется 0,1,2. Если вы вынесете объявление i на строчку выше, то будет так-же как с var.
Все дело в фигурных скобочках :)var funcs = [];
// let's create 3 functions
let i = 0
for (; i < 3; i++) {
// and store them in funcs
funcs[i] = function() {
// each should log its value.
console.log("My value:", i);
};
}
for (var j = 0; j < 3; j++) {
// and now let's run each one to see
funcs[j]();
}
Пустые блоки имеют смысл только если вам нужно ограничить область видимости для какой-то операции. А конкретно вашем примере смысла от скобок нет.