for循环中使用let,最后一次循环结束后i值为什么不进行一次自加
var testVar;
for(var i=0;i<3;i++){
testVar=function(){
console.log(i)
};
}
testVar(); // 结果为3
let testVar;
for(let i=0;i<3;i++){
testVar=function(){
console.log(i)
};
}
testVar(); // 结果为2
testVar中的闭包中保存了i的引用,而不是i当前的值,而i值在最后一次循环结束后执行了一次i++变成了3。
但是let的for循环,最后一次循环,应该也是保存了i的引用,而这个i在最后一次循环结束后也应该执行一次i++,也应该变成3。但是输出为什么是2。
由于对闭包的理解不同,而闭包不是这个问题的重点,所以我又换了个方式重新提问,如下------------------------
testVar()返回的是这个函数被调用的时候的i值,用var的for循环,最后一次循环i值是2,由于被调用的时候循环已经结束,i值要进行一次i++,所以变成了3;
而let的for循环,理论上来讲,也是这样的过程,最后也要进行i++,为什么还是2?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
不,你不明白
你的代码相当于:
那么你告诉我,为什么不是3?跟闭包一点关系没有,仅仅因为
i
是全局变量,等你testVar()
,i
已经变成了3.ES6
let
的代码相当于等
i=3
的时候,根本不会执行{}
里的代码,所以当然是 2,而且这里的i,k都处于块级作用域,{}
之外根本无法访问。与var
是有完全区别的。es5 没掌握好不建议学es6,先巩固下
var
的变量提升和闭包
吧,es5 没有块级作用域在学 ES6 之前就应该知道的。区别就在于 let 使得每次程序进入花括号就产生了一个块级作用域,因此打印的i就是在这个循环中i最后的值2,在循环之外i是无法访问到的。
而使用var是会产生变量声明提升,所以打印的i是最后的全局的i,3。