【问题标题】:variable created with "let" in global scope vs variable created with "var" inside a loop在全局范围内用“let”创建的变量与在循环内用“var”创建的变量
【发布时间】:2019-09-28 22:03:09
【问题描述】:

我正在尝试获得一些关于 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: Identifier 'i' has been declared

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

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

【问题讨论】:

标签: javascript variables


【解决方案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

【讨论】:

  • 感谢您的回复...我明白您的意思,但是,如果我用var 声明外部i 并在循环内重新声明它,JavaScript 不会抱怨并重新分配具有新值的相同变量!我假设var 关键字不能覆盖由let 关键字创建的变量。我说的对吗?
  • var i = 78; console.log(i); for (var i = 0; i &lt; 4; i++) { console.log(i); var insideloop = 100; } console.log(i);
  • 在上述代码的情况下,JavaScript 用新值重新分配变量不会有问题。
猜你喜欢
  • 2015-06-25
  • 1970-01-01
  • 2016-11-13
  • 2016-05-14
  • 1970-01-01
  • 2014-11-11
  • 1970-01-01
  • 2015-03-12
  • 2017-05-22
相关资源
最近更新 更多