有人解释一下这个(var 和 let in for 循环之间的行为差异)吗?
经典面试题(结束语):
let a = [];
for (var i=0; i<10; i++) {
a[i] = function() {
console.log(i,);
}
}
a[0](); // 10
a[1](); // 10
Run Code Online (Sandbox Code Playgroud)如果我们使用让:
let a = [];
for (let i=0; i<10; i++) { // var => let
a[i] = function() {
console.log(i);
}
}
a[0](); // 1
a[1](); // 2
Run Code Online (Sandbox Code Playgroud)是的,我在使用“让”时正常并且符合预期。我想到的第一个想法是 let 不支持关闭。但不,它支持。(随后在 Chrome 上对其进行了测试):
function bb() {
let b = 1;
return function() {
console.log(b);
}
}
bb()(); // 1, means …Run Code Online (Sandbox Code Playgroud) 我们可能知道,var关键字在全局范围内定义一个变量,或者在整个函数中局部定义一个变量,而不管块作用域如何。因此,下面的代码将记录5具有相同值的时间。
for(var i = 0; i < 5; i++){
setTimeout(() => console.log(i), 2000);
}
Run Code Online (Sandbox Code Playgroud)
像这样可视化上面的 JS 运行时
正如你所看到的,Callback Queue中的 5 个任务将等待Call stack为空。因此,在同步循环完成后 - 这意味着在我的情况下调用堆栈为空,然后将执行5 个计划任务 -console.log(i)其值i等于。你可以在这里5玩
我想要的是在之后立即登录i == 2。它按我的预期工作。
for(var i = 0; i < 5; i++){
setTimeout(() => console.log(i), 2000);
}
Run Code Online (Sandbox Code Playgroud)
但我很好奇它是如何工作的,而我不确定调用堆栈是否为空?当我使用 时await,是否允许异步函数的调用者恢复执行,或者其他什么?
图像流的任何解释/可视化将不胜感激。谢谢。
请考虑下面的片段-
for(let i = 1; i <= 5; i++) {
setTimeout(function(){
console.log(i);
},100);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,内部的日志setTimeout将包含i每个 for 循环迭代的变量值,即日志如下
1
2
3
4
5
Run Code Online (Sandbox Code Playgroud)
为此,我已经阅读了 Internet 上的解释,例如 -let为每个循环创建一个变量声明,这是块级声明。所以基本上它在{ }.
但我对这个说法有点困惑。如果let为每个循环创建一个变量声明,它不会总是1按照循环初始化语句进行初始化let i=1吗?此外,变量i在循环块外声明、初始化和递增,即for循环语句中的花括号。那么,在每次迭代中,不是i增加和使用相同的变量吗?究竟如何let为每个循环创建一个变量声明并具有前一次迭代的值?
为什么要使用JavaScript const的作品一样let的for in循环?const用于在EC6中声明常量.那么为什么const num价值在每次迭代中得到更新for in?
为了让我们
for (let num in nums) {
console.log(num); // works well, as usual
}
Run Code Online (Sandbox Code Playgroud)
适用于const
for (const num in nums) {
console.log(num); // why const value getting replaced
}
Run Code Online (Sandbox Code Playgroud) 问题标题似乎很简单,但这不是我要问的问题.请尝试以下示例
for(let i=0; i<5; i++){
//console.log(i);
let i=5
console.log(i);
}Run Code Online (Sandbox Code Playgroud)
这个例子有效,我的问题是如何在for循环中声明另一个具有相同标识符的变量.
我真的很困惑,发生了什么事?
ecmascript-6 ×5
javascript ×5
for-loop ×2
asynchronous ×1
closures ×1
for-in-loop ×1
let ×1
promise ×1
scope ×1
variables ×1