JQuery函数在$ .each完成之前返回

时间:2014-05-01 21:01:33

标签: javascript jquery each

此脚本是chrome扩展的一部分,它将遍历表,查找匹配项,并将消息发送回后台脚本。这是脚本(内容脚本):

function resolveMulti(city){
  counter = 1;
  results = "";
  resultsArray = $("iFrame").contents().find("#table tr[id*='row'] td:nth-child(13)");
  resultsArray.each(function(index){
    if($(this).html().toLowerCase() == city.toLowerCase()){
      results = "Found";
    }
    else if(counter == resultsArray.length){
      results = "No City Match Found";
    }
    counter++;
  });
  return results;
}

该函数在$ .each循环完成之前返回。由于'结果'在评估$ .each循环之前,浏览器没有定义,浏览器会产生一个“结果”错误。还没有被定义。如何从此函数返回正确的结果?

1 个答案:

答案 0 :(得分:2)

首先是你的问题,然后是关于该代码中几个问题的一些注释。

  

该函数在$ .each循环完成之前返回。

不,不是。它可能会引发一个类似但不同的异常。

  

因为'结果'在评估$ .each循环之前,浏览器没有定义,浏览器会产生一个“结果”错误。还没有被定义。如何从此函数返回正确的结果?

通过声明变量。您需要在函数中使用var results

function resolveMulti(city){
  var results; // <=========== Here
  counter = 1;
  resultsArray = $("iFrame").contents().find("#table tr[id*='row'] td:nth-child(13)");
  resultsArray.each(function(index){
    if($(this).html().toLowerCase() == city.toLowerCase()){
      results = "Found";
    }
    else if(counter == resultsArray.length){
      results = "No City Match Found";
    }
    counter++;
  });
  return results;
}

没有一个,在松散模式下,你会成为The Horror of Implicit Globals的牺牲品(在严格模式下,这将是一个错误)。但是Implicit Globals的恐怖只适用于设置;如果碰巧该jQuery选择器没有匹配项,那么您永远不会设置任何内容,因此永远不会创建全局,并且return将尝试读取的值未定义的符号,即使在松散模式下也会导致ReferenceError

很难从显示的代码段中看出来,但您可能还有其他未声明的变量(counterresultsArray),您要声明var

但是还有另一个问题:您的results变量将具有each循环的 last 迭代的结果,覆盖上一次迭代中的任何值。如果根本没有匹配元素,它将永远不会有值。我怀疑你想要这样的东西:

function resolveMulti(city){
  var results = "No City Match Found";
  var resultsArray = $("iFrame").contents().find("#table tr[id*='row'] td:nth-child(13)");
  resultsArray.each(function(index){
    if($(this).html().toLowerCase() == city.toLowerCase()){
      results = "Found";
      return false; // <== Stops the `each` loop
    }
  });
  return results;
}