Javascript 在for循环中使用const作为循环变量

Javascript 在for循环中使用const作为循环变量,javascript,angular,typescript,ecmascript-6,Javascript,Angular,Typescript,Ecmascript 6,我理解在中使用var和let进行的行为,在typescript/javascript中使用for循环,但是有人能解释一下常量变量作为循环变量的行为和原因吗 for (const i = 0; i < 5; i++) { setTimeout(function() { console.log(i) }, 100 * i); } for(常数i=0;i

我理解在
中使用
var
let
进行
的行为,在
typescript
/
javascript
中使用
for
循环,但是有人能解释一下常量变量作为循环变量的行为和原因吗

for (const i = 0; i < 5; i++) {
  setTimeout(function() {
    console.log(i)
  }, 100 * i);
}
for(常数i=0;i<5;i++){
setTimeout(函数(){
控制台日志(i)
},100*i);
}
据我所知,当您将变量声明为
const
并初始化其值时,该值不能更改

但是您可以在
控制台.log()中看到值被更改。编译时必须抛出一个错误,对吗?我在这里缺少什么

我为这种行为创建了两个示例


有人能帮我理解吗

它在Stackblitz中工作,因为它运行的是traspiled代码:

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);
    }
};
AppComponent.prototype.test=函数(){
var _loop_1=函数(i){
setTimeout(函数(){
控制台日志(i);
},100*i);
};
对于(变量i=0;i<5;i++){
_环_1(i);
}
};
如果您在此处添加一个代码段,它将不起作用,因为它未被传输

for(常数i=0;i<5;i++){
setTimeout(函数(){
控制台日志(i)
},100*i);

}
回答您的问题

  test(){
    for(const 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);
    }
  }
test(){
让我;
//在该块中只能执行多次
对于(i=0;i<5;i++){
setTimeout(函数(){
控制台日志(i)
},100*i);
}
}

由于
const
let
都在其定义的区块顶部进行了吊装,
const
let
之间的唯一区别是声明的变量const不能重新初始化。

const
let
都具有块范围,并在其定义的块顶部提升,
const
let
之间的唯一区别是声明的变量
const
不能重新初始化请包含问题本身中的所有代码,不仅在外部站点上。@messerbill一个真实的ES2015环境实际上有常量。@HereticMonkey如果不是stackblitz示例,我可能会包含代码,但我无法显示行为。我希望你能理解我的想法如果是这样的话,你知道这种行为只有在Stackblitz中才能复制,那么你应该在问题中提到。看起来我不应该太信任Stackblitz,或者我不明白Stackblitz是如何工作的。非常感谢您澄清了这个疑问。因此,我正确地假设循环将中断。@tbf,它确实在
i++
下显示了红色的曲线,并显示了错误消息:“无法分配给'i',因为它是常量或只读属性。”然而,它编译了,这就是我有点困惑的地方,它与这种行为无关,对吗?如果我声明的循环变量const@CruelEngine一旦初始化了yes,就不能增加
const
变量,但是代码在我在question@CruelEngine我认为webpack正在将代码传输到ES3以保持兼容性,而ES3没有
const
let
const
转换为
var
。无论如何,您可以检查dist文件夹中传输的文件。
  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);
    }
  }