Использование const в качестве переменной цикла для цикла for - PullRequest
2 голосов
/ 09 мая 2019

Я понимаю поведение использования var и let в цикле for в typescript / javascript, но кто-то может объяснить, почему и как ведет себя переменная const как переменная цикла?

for (const i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i)
  }, 100 * i);
}

Из того, что я понимаю, когда вы объявляете переменную как const и инициализируете ее значение, значение не может быть изменено

Тем не менее, вы можете видеть, что значение изменяется в console.log(). При правильной компиляции должна возникать ошибка? Чего мне здесь не хватает?

Я создал 2 примера для этого поведения.

Переменная Loop в виде константы

Переопределение константных переменных

Может кто-нибудь помочь мне понять это?

Ответы [ 2 ]

6 голосов
/ 09 мая 2019

Это работает в Stackblitz, потому что он запускает перехваченный код:

AppComponent.prototype.test = function () {
    var _loop_1 = function (i) {
        setTimeout(function () {
            console.log(i);
        }, 100 * i);
    };
    for (var i = 0; i < 5; i++) {
        _loop_1(i);
    }
};

Это не будет работать, если вы добавите сюда фрагмент, потому что он не передается

for (const i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i)
  }, 100 * i);
}

enter image description here

0 голосов
/ 09 мая 2019

Отвечая на ваш вопрос,

  test(){
    for(const i =0 ; i< 5; i++){
      setTimeout(function(){
        console.log(i)
      },100*i);
    }
  }

Этот код по существу становится,

  test(){

    // can be only initialized once
    const i;
    for(i = 0 ; i< 5; i++){
      setTimeout(function(){
        console.log(i)
      },100*i);
    }
  }

Поскольку каждая переменная JavaScript поднята в верхней части своей области, в этом случае test() как ее переменная const, поэтому она поднята в этом блоке и недоступна за ее пределами.

Чтобы исправить кусок кода:

  test(){

    // can be only multiple times in that block
    for(let i = 0 ; i< 5; i++){
      setTimeout(function(){
        console.log(i)
      },100*i);
    }
  }

Что становится,

  test(){

    let i;
    // can be only multiple times in that block
    for(i = 0 ; i< 5; i++){
      setTimeout(function(){
        console.log(i)
      },100*i);
    }
  }

Так как const и let имеют область действия блока и находятся в верхней части блока, в котором он определен, единственное различие между const и let состоит в том, что переменные, объявленные как const, не могут переинициализироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...