闭包
常见的闭包例子
function biBao(){
var arr = [];
for (var i = 0; i < 5; i++) {
arr[i] = function(){
return i;
}
}
return arr
}
console.log(biBao()[0]()) //5
1.大家可以看到,控制台输出的是 5,之前我并不清楚这段代码实质上是发生了什么,为什么会是5(不知道是不是只有我~~),然后我去了网上找了一些资料,总结了一下
for
循环内部把 function(){return i}
赋给 arr[i]
的时候,function(){return i}
实质上只是一个函数声明而已。所以biBao()
返回的是一个带有5个函数声明的数组,即[function,function,function,function,function]
。biBao()[0]
即取出arr
数组的一个个函数声明,biBao()[0]()
即是开始运行arr
数组中的第一个函数,然而这个时候for
循环已经早已运行完毕了,这个时候i
是循环过后的i
所以i
这个时候等于5
2.为什么上述例子吧for循环var i = 0;的声明改成let i= 0;就可以解决问题了?
如果变量i
是let
声明的,那么i
就只能在本次循环中有效,所以每一次循环的i
其实都是一个新的变量,然后javascript引擎内部会记住上一轮循环的i
的值,初始化本轮的i
时,在上一轮的基础上进行计算