Javascript不会在循环中生成函数

Javascript不会在循环中生成函数,javascript,function,loops,Javascript,Function,Loops,有人能告诉我这个代码有什么问题吗?第一:我没有得到期望的结果,第二:我得到了著名的“不要在循环中生成函数”。我怎样才能解决这个问题 // Modify this file to make `getNames` work as described // The tests in index.html will pass when the function is working // // Given a list of ids, this function should // - use the

有人能告诉我这个代码有什么问题吗?第一:我没有得到期望的结果,第二:我得到了著名的“不要在循环中生成函数”。我怎样才能解决这个问题

// Modify this file to make `getNames` work as described
// The tests in index.html will pass when the function is working
//
// Given a list of ids, this function should
//  - use the nameLookup api to find the name for each id
//  - call the callback argument with an object in the format
//    { 1: 'Name1', 2: 'Name2', 3: 'Name3' }
function getNames(ids, callback) {
  var index,
    id,
    results = { };

  for(index = 0; index < ids.length; index++) {
    id = ids[index];

    nameLookup.nameOf(id, function(name) {
      results[id] = name;
    });
  }

  callback(results);
}

因此,在循环之前创建函数:

function getFunc(id) {
  return function(name) {
      results[id] = name;
      done ++;
      if (done == ids.length) {
          callback(results);
      }
    }
}

function getNames(ids, callback) {
  var index,
    id,
    results = { };

  var done = 0;
  for(index = 0; index < ids.length; index++) {
    id = ids[index];

    nameLookup.nameOf(id, getFunc(id));
  }
}
函数getFunc(id){ 返回函数(名称){ 结果[id]=名称; 完成++; if(done==ids.length){ 回调(结果); } } } 函数getNames(ID、回调){ var指数, 身份证件 结果={}; var done=0; 对于(索引=0;索引因此,在循环之前执行函数:

function getFunc(id) {
  return function(name) {
      results[id] = name;
      done ++;
      if (done == ids.length) {
          callback(results);
      }
    }
}

function getNames(ids, callback) {
  var index,
    id,
    results = { };

  var done = 0;
  for(index = 0; index < ids.length; index++) {
    id = ids[index];

    nameLookup.nameOf(id, getFunc(id));
  }
}
函数getFunc(id){ 返回函数(名称){ 结果[id]=名称; 完成++; if(done==ids.length){ 回调(结果); } } } 函数getNames(ID、回调){ var指数, 身份证件 结果={}; var done=0; 对于(索引=0;索引
whats
name
at,
results[id]=name??@SudhansuChoudhary-请参阅上一行。这是参数名。在这种情况下,创建新函数不会产生意外行为,因此您确实不需要更改它。但是,您可以通过将函数声明移到循环之外来优化代码,并反复使用相同的函数。什么是
nameLookup
?@doo再次将其张贴在顶部,但是我不应该修改该部分whats
name
at,
results[id]=name??@SudhansuChoudhary-请参阅上一行。这是参数名。在这种情况下,创建新函数不会产生意外行为,因此您确实不需要更改它。但是,您可以通过将函数声明移到循环之外来优化代码,并反复使用相同的函数。什么是
nameLookup
?@doo再次将其张贴在顶部,但是我不应该修改该部分在查找所有名称之前仍然调用回调啊,我现在看到了问题:)我进行了编辑,请检查是否存在竞争条件,因为每个异步请求共享相同的
id
变量。基本上,您将得到
结果
只包含一个条目,最后一个id作为键,以及返回最后一个id的请求的值(不一定是最后一个id)。@Prinzorn,换句话说,我们又回到了“在每个循环中创建函数”的过程中,将id包含在闭包中,不是吗?我想是这样的。老实说,我会直接使用,但因为这个问题听起来像是家庭作业,可能是不允许的。在查找所有名称之前仍会调用回调。啊,我现在看到了问题:)我进行了编辑,请检查您现在有一个争用条件,因为每个异步请求共享相同的
id
变量。基本上,您将得到
结果
只包含一个条目,最后一个id作为键,以及返回最后一个id的请求的值(不一定是最后一个id)。@Prinzorn,换句话说,我们又回到了“在每个循环中创建函数”的过程中,将id包含在闭包中,不是吗?我想是这样的。老实说,我会直接用,但因为这个问题听起来像是家庭作业,所以可能是不允许的。