为什么下面的函数b(在Node JS中)跳过迭代?

我一直在研究Node JS如何执行代码。如果我在两个函数中都将'sleep'参数设置为1,则它将按预期工作。 但是由于两个函数的延迟不同,它会以最长的延迟跳过该函数的迭代。 我希望函数b记录从0到99的所有数字,但比函数a慢。

See the code in mycompiler.io

a()
b()

async function a() {
  for (n=1; n<100; n++) {
    console.log('a', n)
    await sleep(1)
  }
}

async function b() {
  for (n=1; n<100; n++) {
    console.log('b', n)
    await sleep(3)
  }
}

function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  })
} 
评论
钱海秋
钱海秋

As @CertainPerformance mentioned in the comment you must declare your variable if you want your for loops to perform correctly here. for(let n; n<100; n++)

假设您不是在严格模式下运行节点,那么这n个变量现在实际上是在引用单个共享变量,因此您应该注意到,实际上没有数字被跳过,而是两个函数都创建了一个从1到99的单个共享迭代。

这是此版本的工作版本:

'use strict'

a()
b()

async function a() {
  for (let n=1; n<100; n++) {
    console.log('a', n)
    await sleep(1)
  }
}

async function b() {
  for (let n=1; n<100; n++) {
    console.log('b', n)
    await sleep(3)
  }
}

function sleep(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  })
} 

为了再次回应注释中所说的内容,如果您以严格模式运行脚本,则在运行代码时会抛出此错误:

ReferenceError: n is not defined
点赞
评论
ut_et
ut_et

当在一个函数中更改了全局n变量时,您正在使用它。您应该有2个单独的变量,或者至少没有n作为全局变量。 为此,您可以在for循环中的n前面添加关键字let,如下所示:

for(let n = 1; n < 100; n ++) {
点赞
评论