为了账号安全,请及时绑定邮箱和手机立即绑定

在 for 循环初始化中使用 let 时,为什么 let 变量在封闭范围内不可用?

在 for 循环初始化中使用 let 时,为什么 let 变量在封闭范围内不可用?

慕妹3146593 2021-06-09 10:33:50
这对我来说一直是一个挥之不去的问题:如果当 alet或const标识符包含在大括号中时创建块范围,那么循环let的初始化语句中的标识符如何for在封闭范围内不可用,而是在大括号内可用for循环的括号?(function() {  for (let i = 0; i < 5; i++) {   console.log(i) // logs current value of i  }  console.log(i) // referenceError})()
查看完整描述

3 回答

?
喵喔喔

TA贡献1735条经验 获得超5个赞

这就是事情的运作方式。在这样的for循环顶部声明的变量仅在当前迭代的for块内可见。你可以这样想:


<loop> {

  let i = getCount();

  console.log(i) // logs current value of i

}

wheregetCount运行递增的逻辑i。


用 with 声明的变量let是块范围的 -i在外部引用是没有意义的。如果i 是的外部可见的for,你会想到它的价值是?i对于循环的每次迭代,您已经有了一个单独的绑定。有点随意地选择这些绑定之一在外面可见是没有意义的。


查看完整回答
反对 回复 2021-06-18
?
慕莱坞森

TA贡献1810条经验 获得超4个赞

因为它是for循环中的局部变量,而不是在循环之外。如果您已在循环外声明它,则可以正确访问它。


(function() {

  let i;

  for (i = 0; i < 5; i++) {

   console.log(i);

  }

  console.log(i);

})();


查看完整回答
反对 回复 2021-06-18
?
UYOU

TA贡献1878条经验 获得超4个赞

如果您不想更改语法,可以使用var.


(function() {

    for (var i = 0; i < 5; i++) {

        console.log(i);

    }

    console.log(i); 

    // this should work.

})()

否则,使用let或声明的变量const具有所谓的块范围,这意味着它仅在定义它的花括号内可见。这本质上是let和之间的根本区别var。与声明的变量var具有函数范围(这整个功能是可见的,它的词汇的定义,它的价值也只是甚至之前undefined)


(function() {

    console.log(i); // undefined

    var i = 10;

    console.log(i); // 10

 })();

但是上面的例子只有在没有"use strict"任何地方时才有效。


查看完整回答
反对 回复 2021-06-18
  • 3 回答
  • 0 关注
  • 274 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信