在全局范围内用“ let”创建的变量与在循环内用“ var”创建的变量

时间:2019-05-11 03:49:42

标签: javascript variables

我正在尝试获取有关JavaScript中变量声明的经验。 在以下代码中,每当我尝试使用var关键字在循环内定义变量时,都会抛出错误:

  

“未捕获的SyntaxError:标识符'i'已经被声明”。

而如果我使用“ let”关键字(或完全不使用关键字),则没有问题。 我知道在不使用任何关键字的情况下,JavaScript在全局范围内使用相同的变量并将其覆盖。 我也知道用“ let”关键字创建的变量被认为是块作用域,而用“ var”关键字在函数外部创建的变量被认为是全局变量。但我不了解这种行为! 如果有人能对此事有所启发,我将不胜感激。

此代码:

let i = 78;
console.log(i);
for (var i = 0; i < 4; i++) {
    console.log(i);
    var insideloop = 100;
}

console.log(i); 给出此错误:未捕获的SyntaxError:标识符'i'已经被声明

但是这个没有问题,并给出以下输出:

let i = 78;
console.log(i);
for (let i = 0; i < 4; i++) {
    console.log(i);
    var insideloop = 100;
}
console.log(i);

结果: 78 0 1个 2 3 78

1 个答案:

答案 0 :(得分:1)

在全局范围内的任何块内用var声明的变量不是该块的局部变量(在您的情况下,它是for循环的块),但它们在全局范围内。

因此,在您的第一个示例中,您尝试重新声明变量i,该变量之前已经在全局范围内使用let声明过。

for(var i =0;i<5;i++){}
console.log(i); //i is in global scope

如果在您的情况下在任何块中声明为let,则它仅限于for循环块。它不在外面。

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