@Neinerion321342

Проблема функций с помощью массива с var?

Сколько ни пытался понять данный код, так и не понял
var это что-ли ссылочный тип? тогда поулчается бессмысица

var funcs = [];
// let's create 3 functions
for (var i = 0; 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]();
}


Также смысл использования пустых блоков по типу данного кода:
{
console.log(2342354);
}


Так вообще корректно делать по правилам хорошего тона и где такое вообще можно нормально применить крмео как скоупов и главное зачем это?
  • Вопрос задан
  • 97 просмотров
Пригласить эксперта
Ответы на вопрос 1
Stalker_RED
@Stalker_RED
Это фокус с машиной времени. Дело в том, что код не всегда исполняется сверху вниз, как вы его читаете. В момент создания функций переменная меняется на 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]();
}


Пустые блоки имеют смысл только если вам нужно ограничить область видимости для какой-то операции. А конкретно вашем примере смысла от скобок нет.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы