ES6中'let'关键字的范围是什么(请参阅下面的代码片段)

时间:2018-05-08 19:10:57

标签: javascript ecmascript-6

问题标题似乎很简单,但这不是我要问的问题。请尝试以下示例

for(let i=0; i<5; i++){
	//console.log(i);
	let i=5	
	console.log(i);
}

这个例子有效,我的问题是如何在for循环中声明另一个具有相同标识符的变量。

我真的很困惑,发生了什么?

4 个答案:

答案 0 :(得分:5)

有关let循环中for的语义,请参阅Explanation of `let` and block scoping with for loops

  

如何在for循环中声明另一个具有相同标识符的变量?

这是因为你的for循环有一个块语句作为它的主体,在那里你可以声明自己的块范围变量,遮蔽来自父范围的变量

答案 1 :(得分:0)

在以下示例中,您将i的值设置为5,以便循环结束,因为循环i<5的条件。因此循环再次运行条件为假

&#13;
&#13;
for(let i=0; i<5; i++){
	//console.log(i);
	i=5	
	console.log(i);
}
&#13;
&#13;
&#13;

在你的第一个例子中,循环继续coz let i =5被认为是for循环范围中的一个单独变量

答案 2 :(得分:0)

我认为下面的代码会消除您的所有疑问这都是关于scope,您无法在同一个scope中重新定义相同的变量,但您可以在嵌套的scope中定义

您的代码for中发生的同样事情具有自己的范围,for内部意味着

for { //inside this } is  nested scope of `for`.

&#13;
&#13;
{
    let a = "a";
    console.log(a);
    {
        let a = "b";
        console.log(a);
    }
    console.log(a);
}
&#13;
&#13;
&#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
}