前段时间,我读了一些关于在JavaScript中使用let和var的文章,他们说你使用&#34; var&#34;关键字(即使在for循环中)只能在它的函数中起作用,那么为什么可以在一个函数中创建多个for循环,每个函数看起来像:for (var i = 0; i < array.length; i++);
并且JavaScript没有问题&#34;重新声明&#34; i变量?谢谢:))
答案 0 :(得分:2)
JS有var
的特殊情况,因为它允许提升,这意味着允许多个相同变量的声明,并且它们被移动到封闭的功能范围。但是它们仍然是相同的变量。请考虑以下代码:
function foo(){
for(var i=0; i<3; i++){
console.log("x");
}
for(var i;i<6;i++){
console.log("y");
}
}
foo()
请注意,在第二个循环中没有初始化i,但它会正常执行并生成3 x
和3 y
。它曾经是旧浏览器的问题,但新浏览器只允许它没有给出错误。
答案 1 :(得分:1)
一个看似很小的问题,答案很复杂。 var
是旧方法声明。您可以根据需要随时随地声明它。 JavaScript不会在乎。所有声明的变量都可以立即使用,因为声明会被移动到函数代码的最开头。这被称为吊装。
let
是声明变量的新方法。 const
存在,但我们现在对此并不感兴趣。 let
是块范围的。 let
背后的规则和范围可能令人困惑,但它有利于学习/理解。这是JavaScript的未来。我在我的博客文章here中详细讨论了它。
答案 2 :(得分:0)
ES6引入了'let'关键字来解决此问题。它允许变量在函数内绑定到其范围,这样您就无法在外部重新声明它以防止提升问题。示例 -
for(var i=0; i<5; i++) {
console.log(i);
}
console.log(i);
此处输出为 - 0 1 2 3 4 5 而不是5,我们必须得到'未捕获参考错误',因为变量i应该只在函数内可访问。由于JavaScript中的Hoisting,所有变量和函数名称在执行之前都存储在一个位置。所以代码实际上如下所示 -
var i;
for(i=0; i<5; i++) {
console.log(i);
}
console.log(i);
如果您使用 let 关键字,则会解决此问题。
答案 3 :(得分:0)
let赋予您特权,以声明范围有限的变量,而不是var。
var是一个关键字,它在全局范围内定义变量,而与块范围无关。