我的关于前端一些知识点的理解《一》

闭包

常见的闭包例子

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;就可以解决问题了?

如果变量ilet声明的,那么i就只能在本次循环中有效,所以每一次循环的i其实都是一个新的变量,然后javascript引擎内部会记住上一轮循环的i的值,初始化本轮的i时,在上一轮的基础上进行计算

你可能感兴趣的:(我的关于前端一些知识点的理解《一》)