Javascript 关于闭包的查询以及var和let之间的差异

Javascript 关于闭包的查询以及var和let之间的差异,javascript,Javascript,我以前在SO上发布过: 答案是将var更改为let 在学习python几个月后,我现在正在学习javascript。我只是想看看我的分析哪里出了问题,因为我正在努力应用块范围和函数范围的概念 以下是原始代码片段: for (var i = 0; i < 5; i++) { setTimeout(function() { console.log(i); }, i * 1000 ); } 到 这是我最初认为它应该做的。我不明白为什么在第一种情况下需要使用let I,但在第二种情况下,它

我以前在SO上发布过:

答案是将
var
更改为
let

在学习python几个月后,我现在正在学习javascript。我只是想看看我的分析哪里出了问题,因为我正在努力应用块范围和函数范围的概念

以下是原始代码片段:

for (var i = 0; i < 5; i++) {
  setTimeout(function() { console.log(i); }, i * 1000 );
}

这是我最初认为它应该做的。我不明白为什么在第一种情况下需要使用
let I
,但在第二种情况下,它可以与
var
配合使用


另一个混淆点是,如果使用
setTimeout
函数获取第一个代码段,则最后打印的
i
的值为5。考虑到我们最初的for循环应该只运行到
ii,这是没有意义的。如果可能的话,我希望有人来解决我的特定查询?这个网站上有没有提供这种服务?“我不明白为什么在第一种情况下需要使用
let I
,但在第二种情况下,它可以与
var
配合使用”,因为没有
setTimeout
,您会立即使用
I
,因此您可以看到它的当前值。使用
setTimeout
,您将在以后代码运行时看到它的值。相反,对于
let
,每个循环迭代都有不同的
i
(字面上是不同的变量)。“考虑到我们最初的for循环应该只运行到
为止,这没有意义。这是我一直在寻找的,谢谢,现在它更有意义了。下面是更深入的解释:顺便说一句,我将在明年初发布时介绍这一点。快乐编码!如果可能的话,我希望有人回答我的具体问题?这个网站上有没有提供这种服务?“我不明白为什么在第一种情况下需要使用
let I
,但在第二种情况下,它可以与
var
配合使用”,因为没有
setTimeout
,您会立即使用
I
,因此您可以看到它的当前值。使用
setTimeout
,您将在以后代码运行时看到它的值。相反,对于
let
,每个循环迭代都有不同的
i
(字面上是不同的变量)。“考虑到我们最初的for循环应该只运行到
为止,这没有意义。这是我一直在寻找的,谢谢,现在它更有意义了。下面是更深入的解释:顺便说一句,我将在明年初发布时介绍这一点。快乐编码!
for (var i = 0; i < 5; i++) {
   console.log(i);
}
5
5
5
5
5
0
1
2
3
4