请问一下下面的代码执行的结果为什么不一样?

for (var i=1; i<=5; i++) {
setTimeout( function timer() {
console.log(i);
}, i*1000 );
}

for (let i=1; i<=5; i++) {
setTimeout( function timer() {
console.log(i);
}, i*1000 );
}
的执行结果为什么不一样,他们执行的原理分别是什么?

var在这里声明的i是全局变量,i始终只有一个。
你在循环中创建了5个定时器。当定时器触发时,那个循环早就结束了,那时的i的值已经是循环最大值加1了。

而用 let 声明的是块作用域变量,当在for中使用时每次循环都会在循环体的块作用域内创建一个新的i变量,
每次循环体块作用域都会与定时器的function函数形成“闭包”,闭包可以让每次块作用域内的i变量保留,不会被系统回收。

var声明了一个变量,并且可以同时初始化该变量。
let语句声明一个块级作用域的本地变量,并且可选的赋予初始值。
const 声明创建一个只读的常量,作用域与let相同。这不意味着常量指向的值不可变,而是变量标识符的值只能赋值一次。
传送门:https://segmentfault.com/a/1190000008734811
如果有帮到你!
请采纳下!谢谢!