for...of 循环奇怪的行为

时间:2021-03-11 11:00:20

标签: javascript node.js express

我一直在使用 express 中的动态路由分配问题,并从 for ... of 循环中偶然发现了意外行为。

我的想法很简单:

  1. 创建简单数组

    const roomsArray = ["Algebra", "Backend", "Frontend"];

  2. 遍历该数组并为数组中的每个项目创建一个路由,所以我尝试使用 for ... of loop

     router.get(`/room/${i}`, isUser, (req, res) => {
       res.render("index/room", { path: "index/room", name: i });
     })
    } ```
    

结果出乎意料(至少对我而言)。每条路线都按预期创建,但无论我要测试哪条路线,分配给 iname 值始终是数组中最后一项的值。

切换到 for 循环或 forEach 解决了问题,一切都按预期运行,但是我想知道 为什么使用 for ... of 语句会发生这种行为?

1 个答案:

答案 0 :(得分:2)

你可能已经展示了循环。根据描述,您可能有 var:

for(var x of [1,2,3])
  setTimeout(()=>console.log(x),0);

并且可以只用 let 代替修复:

for(let x of [1,2,3])
  setTimeout(()=>console.log(x),0);

let 的作用域是块级别,因此每个回调都会看到一个单独的变量。 var 的作用域是函数级(或此处为全局),因此每个回调都会看到包含最后一个值的相同变量。