for循环中使用let,最后一次循环结束后i值为什么不进行一次自加

发布于 2022-09-07 08:53:58 字数 607 浏览 19 评论 0

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

黯然 2022-09-14 08:53:58

var的for循环我明白

不,你不明白

你的代码相当于:

var testVar,i;
for(i=0;i<3;i++){
    testVar=function(){
    console.log(i)
    };
}
testVar();

那么你告诉我,为什么不是3?跟闭包一点关系没有,仅仅因为i 是全局变量,等你testVar()i已经变成了3.

ES6 let 的代码相当于

let testVar;
for(let i=0;i<3;i++){
    let k=i;
    testVar=function(){
      console.log(k)
    };
}
testVar(); 

i=3的时候,根本不会执行{}里的代码,所以当然是 2,而且这里的i,k都处于块级作用域,{}之外根本无法访问。与var是有完全区别的。

es5 没掌握好不建议学es6,先巩固下var的变量提升和闭包吧,es5 没有块级作用域在学 ES6 之前就应该知道的。

别念他 2022-09-14 08:53:58

区别就在于 let 使得每次程序进入花括号就产生了一个块级作用域,因此打印的i就是在这个循环中i最后的值2,在循环之外i是无法访问到的。
而使用var是会产生变量声明提升,所以打印的i是最后的全局的i,3。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文