蝴蝶刀刀
闭包的产生就是局部作用域中有对外部作用域变量的引用,原代码指向的是一个全局变量所以毫无意义for (let i = 0; i < 5; i++) {
setTimeout(function() { console.log(new Date, i);
}, 1000);
}console.log(new Date, i);这样就很好理解了,let声明的变量具有块级作用域,只有在代码块中能使用,代码块中挂起的异步函数能访问到i(块级作用域中的i)异步函数中有对外部变量i的引用从而产生闭包而外部使用变量会因为没有声明而报错一开始的代码输出5个5是因为执行异步代码 setTimeout(function() { console.log(new Date, i); }, 100);中的console.log(new Date, i);时for循环已经完毕了,i已经是5了,注意setTimeout(...)是同步的,其中的代码块是异步的或者这样for (var i = 0; i < 5; i++) {
(function(i){
setTimeout(function() {
console.log(new Date, i);
}, 1000);
})(i);
}console.log(new Date, i);这里相当于保存了i的快照版本作为参数传入至于为什么是同步输出的(其实是依次输出的),for循环执行setTimeout是同步的,又没阻塞代码存在每次循环的时间间隔小到可以忽略不计,执行异步代码也没有其他异步代码与阻塞代码的干扰,所以执行的时候感觉是一瞬间一起出现的