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

闭包

常见的闭包例子

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时,在上一轮的基础上进行计算

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 第2章 基本语法 2.1 概述 基本句法和变量 语句 JavaScript程序的执行单位为行(line),也就是一...
    悟名先生阅读 9,782评论 0 13
  • 木子十二阅读 1,441评论 0 0
  • 是夜 嘶吼着 狂奔于每一个灯火阑珊的街市 寻遍了每一条巷子 吹熄了每盏未灭的灯 煽起了每个未眠的人的冷 是它 夜晚...
    阿令令令阅读 1,679评论 0 5
  • 老师早上好,我是来自XX大学的某某! 在自我介绍之前我想我想讲讲我对老师的理解:……
    周萍丶雷雨里的大少爷阅读 1,598评论 2 5

友情链接更多精彩内容