Ecmascript 6 使用let/block作用域的实际优势是什么?

Ecmascript 6 使用let/block作用域的实际优势是什么?,ecmascript-6,let,Ecmascript 6,Let,我似乎看不出使用let的实际好处。当然,如果我有一个for循环,我将使用let I=0而不是var I=0,并且I现在将属于for循环块的范围。但这真的有好处吗?我的意思是,我可以使用var,让变量具有函数范围访问权限,但不在不需要的地方使用它?阻止作用域的优势是什么 我理解var和let之间的区别,我希望对let的特殊优势有一个更为一致的理解 您已经提到了一个优点:循环中的块作用域。这避免了问题,我认为这是JavaScript新手的最大陷阱之一: //使用var var元素=document

我似乎看不出使用
let
的实际好处。当然,如果我有一个for循环,我将使用
let I=0
而不是
var I=0
,并且
I
现在将属于for循环块的范围。但这真的有好处吗?我的意思是,我可以使用var,让变量具有函数范围访问权限,但不在不需要的地方使用它?阻止作用域的优势是什么


我理解var和let之间的区别,我希望对
let
的特殊优势有一个更为一致的理解

您已经提到了一个优点:循环中的块作用域。这避免了问题,我认为这是JavaScript新手的最大陷阱之一:

//使用var
var元素=document.querySelectorAll('.var');
对于(var i=0;i
带有
var
点击我! 点击我! 使用
let
点击我!
点击我可能的重复只是为了确保我得到这个。因此,在第一个示例中,只要调用bar(),foo就不是42,它就变得未定义,因为它已在函数中再次使用var声明,对吗?谢谢,我们将阅读更多关于在循环中定义函数的优点的文章。所以说用let声明的变量不被提升是正确的吗?(我添加了一个关于函数的例子…)围绕这一点已经有了相当多的讨论,因为不同的人将不同的含义与“提升”联系起来。但答案是肯定的:提升意味着变量被声明并初始化为默认值(
未定义
)<代码>let
声明已声明,但默认情况下未初始化。他们仍然在跟踪同名的外部变量。哇,非常感谢你的代码片段。现在完全可以看到块作用域的应用。