问题标题似乎很简单,但这不是我要问的问题。请尝试以下示例
for(let i=0; i<5; i++){
//console.log(i);
let i=5
console.log(i);
}
这个例子有效,我的问题是如何在for循环中声明另一个具有相同标识符的变量。
我真的很困惑,发生了什么?
答案 0 :(得分:5)
有关let
循环中for
的语义,请参阅Explanation of `let` and block scoping with for loops。
如何在
for
循环中声明另一个具有相同标识符的变量?
这是因为你的for
循环有一个块语句作为它的主体,在那里你可以声明自己的块范围变量,遮蔽来自父范围的变量
答案 1 :(得分:0)
在以下示例中,您将i
的值设置为5
,以便循环结束,因为循环i<5
的条件。因此循环再次运行条件为假
for(let i=0; i<5; i++){
//console.log(i);
i=5
console.log(i);
}
&#13;
在你的第一个例子中,循环继续coz let i =5
被认为是for循环范围中的一个单独变量
答案 2 :(得分:0)
我认为下面的代码会消除您的所有疑问这都是关于scope
,您无法在同一个scope
中重新定义相同的变量,但您可以在嵌套的scope
中定义
您的代码for
中发生的同样事情具有自己的范围,for
内部意味着
for { //inside this } is nested scope of `for`.
{
let a = "a";
console.log(a);
{
let a = "b";
console.log(a);
}
console.log(a);
}
&#13;
答案 3 :(得分:0)
似乎很多人都在谈论这里真正的混乱点......
好的,所以当你说
时// scope A
for(let i = 0; i<5; i++) {
//scope B
}
我们知道i
在范围A中声明了 。(这是let
解决的重大问题之一。)所以看来它必须声明在范围B中。但是这个案例呢?
// scope A
for(let i = 0; i<5; i++) console.log(i);
for循环仍然必须有自己的范围,以使i
不在范围A中。我们可以证明这一点。
let i = 37;
for(let i = 0; i < 5; i++) console.log(i);
console.log(i); // prints 37
现在,如果for
语句已经已经有一个范围,即使它没有大括号,那么当我们用块语句替换console.log(i)
时会发生什么?好吧,那个块语句有自己的范围。我们真的有
// Scope A
for( //scope B is actually here
let i = 0; i < 5; i++) {
// Scope C
}