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

这对我来说一直是一个挥之不去的问题:如果当 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

})()


慕妹3146593
浏览 275回答 3
3回答

喵喔喔

这就是事情的运作方式。在这样的for循环顶部声明的变量仅在当前迭代的for块内可见。你可以这样想:<loop> {&nbsp; let i = getCount();&nbsp; console.log(i) // logs current value of i}wheregetCount运行递增的逻辑i。用 with 声明的变量let是块范围的 -i在外部引用是没有意义的。如果i 是的外部可见的for,你会想到它的价值是?i对于循环的每次迭代,您已经有了一个单独的绑定。有点随意地选择这些绑定之一在外面可见是没有意义的。

慕莱坞森

因为它是for循环中的局部变量,而不是在循环之外。如果您已在循环外声明它,则可以正确访问它。(function() {&nbsp; let i;&nbsp; for (i = 0; i < 5; i++) {&nbsp; &nbsp;console.log(i);&nbsp; }&nbsp; console.log(i);})();

UYOU

如果您不想更改语法,可以使用var.(function() {&nbsp; &nbsp; for (var i = 0; i < 5; i++) {&nbsp; &nbsp; &nbsp; &nbsp; console.log(i);&nbsp; &nbsp; }&nbsp; &nbsp; console.log(i);&nbsp;&nbsp; &nbsp; // this should work.})()否则,使用let或声明的变量const具有所谓的块范围,这意味着它仅在定义它的花括号内可见。这本质上是let和之间的根本区别var。与声明的变量var具有函数范围(这整个功能是可见的,它的词汇的定义,它的价值也只是甚至之前undefined)(function() {&nbsp; &nbsp; console.log(i); // undefined&nbsp; &nbsp; var i = 10;&nbsp; &nbsp; console.log(i); // 10&nbsp;})();但是上面的例子只有在没有"use strict"任何地方时才有效。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript