for (let i = 1; i <= 5; i++) {
setTimeout ( function timer() {
console.log(i) // 1,2,3,4,5
}, i * 1000)
}
由于let的存在,使得for循环内形成块级作用域。每次迭代都会产生一个块级作用域,这个作用域记录此次i的值。
timer函数包含有对外部定义作用域中变量i的引用,因此是闭包函数。当它每次回调时,访问的作用域是每次迭代生成的块级作用域,i的值在该作用域中已被记录。