此脚本是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循环之前,浏览器没有定义,浏览器会产生一个“结果”错误。还没有被定义。如何从此函数返回正确的结果?
答案 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
。
很难从显示的代码段中看出来,但您可能还有其他未声明的变量(counter
和resultsArray
),您要声明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;
}