下面是JavaScript中最简单的笑话测试块,在describe
下,我编写了一个简单的test
来打印循环的当前索引(直到5)。但是结果总是Test 5
describe("Hello", async ()=>{
for(var i=0; i<5; ++i){
test(``Test ${i}``, async ()=>{
await console.debug("Test "+ i);
});
}
});
有人可以澄清一下,它如何工作?
答案 0 :(得分:-1)
使用let
代替var
,让我们为每个async
调用保留范围。因此,在每个循环中,i
的新值将被传递到您的方法,并且这些值将保持不变。对于var
,变量i
的作用域为function
(该函数是您在describe()
中用作回调的函数),因此当您使用asyn
方法时解析后,您将看到回调内部存在的i
值,因为循环已经结束,所以该值将为5
。
for(let i=0; i<5; ++i){
// dummy async method
setTimeout(() => {
console.log(i)
}, 2000)
}