Javascript 使用for-loop vs.map构建数组

Javascript 使用for-loop vs.map构建数组,javascript,node.js,Javascript,Node.js,我想创建一个异步函数数组,但我不明白为什么它可以与map一起工作,而不能与for循环一起工作。有人能解释一下这种情况下for循环和map之间的区别吗 异步函数睡眠(ms){ 等待新的承诺((r)=>setTimeout(r,ms)); } 异步函数逻辑(i){ 设时间=i*500; 等待睡眠(时间); log(${i}在${time}之后完成); 返回时间; } 函数示例ConstructResultsViaMap(数据){ const tasks=data.map((日期,i)=>{ con

我想创建一个异步函数数组,但我不明白为什么它可以与map一起工作,而不能与for循环一起工作。有人能解释一下这种情况下for循环和map之间的区别吗

异步函数睡眠(ms){
等待新的承诺((r)=>setTimeout(r,ms));
}
异步函数逻辑(i){
设时间=i*500;
等待睡眠(时间);
log(${i}在${time}之后完成);
返回时间;
}
函数示例ConstructResultsViaMap(数据){
const tasks=data.map((日期,i)=>{
const task=async()=>逻辑(i);
返回任务;
});
返回任务;
}
函数示例ConstructResultsViafor(数据){
常量任务=[];
设i=0;
用于(数据的施工日期){
const task=async()=>逻辑(i);
任务。推送(任务);
i++;
}
返回任务;
}
(异步()=>{
常量数据=['a','b'];
const tasksMap=示例ConstructResultsViamap(数据);
const resultsMap=wait Promise.all(tasksMap.map((p)=>p());
console.log(resultsMap);//[0500]
const tasksFor=示例ConstructResultsViafor(数据);
const resultsFor=wait Promise.all(tasksFor.map((p)=>p());
console.log(resultsFor);//[10001000]
})();
示例ConstructResultsViaFor
中调用
逻辑(i)
时,循环已经完成,
i
等于2

您可以使用一个简单的
for
循环,使用
let
,该循环具有块范围:

function exampleConstructResultsViaFor(data) {
  const tasks = [];
  for (let i = 0; i < data.length; i++) {
    const task = async() => logic(i);
    tasks.push(task);
  }
  return tasks;
}
exampleConstructResultsViaFor
中调用
logic(i)
时,循环已经完成,并且
i
等于2

您可以使用一个简单的
for
循环,使用
let
,该循环具有块范围:

function exampleConstructResultsViaFor(data) {
  const tasks = [];
  for (let i = 0; i < data.length; i++) {
    const task = async() => logic(i);
    tasks.push(task);
  }
  return tasks;
}

这回答了你的问题吗?这回答了你的问题吗?因此,函数(任务)可以访问父作用域(词法作用域)。当调用函数时,它们使用外部函数作用域的i,此时为2?正是。这就是为什么使用闭包可以解决这个问题,这就是为什么它可以使用
map
。因此函数(任务)可以访问父作用域(词法作用域)。当调用函数时,它们使用外部函数作用域的i,此时为2?正是。这就是为什么使用闭包可以解决这个问题,这就是为什么它可以使用
map