for (var i = 0; i < 5; i++) {setTimeout(function () { console.log(i); }, 0)} // 结果 5 5 5 5 5
for (let i = 0; i < 5; i++) {setTimeout(function () { console.log(i); }, 0)} // 结果 0 1 2 3 4
for循环头部的var是一个全局变量,而setTimeout是一个异步函数。异步函数会在队列中等待for循环执行之后,再执行。
for循环头部的let声明还会有一个特殊的行为。这个行为指出变量在循环过程中不止被声明一次,每次迭代都会声明。随后的每个迭代都会使用上一个迭代结束时的值来初始化这个变量。