这很简单:
var shouldDoThis = function(query) {
documents.forEach(function(section) {
section.words.forEach(function(word) {
if (word.content == query.content) {
return true;
}
});
});
return false;
};
这是一个(糟糕的)重写的片段 - 如果我传入一个应该解析为true的查询,'return true'会被命中但是然后跳到右边返回false,所以这总是评估为false。我做错了什么?
答案 0 :(得分:4)
因为你总是回归假。 return true
在其他范围内。
您应该像这样编写代码:
var shouldDoThis = function(query) { // 1st level
var should;
documents.forEach(function(section) { // 2nd level
section.words.forEach(function(word) { //3rd level
if (word.content == query.content) {
should = true;
return; // you "quit" the 3rd level function. This returns to 2nd level
}
}); // end of 3rd level
}); // end of 2nd level
return should;
}; // end of 1st level
更多信息:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions_and_function_scope
答案 1 :(得分:0)
如果你在逻辑上打破这些,可能会更有意义。虽然不一定是JavaScript语法,但想象一下:
function shouldDoThis(query) {
documents.forEach(sectionDo);
return false;
}
function sectionDo(section) {
section.words.forEach(wordDo);
}
function wordDo(word) {
if (word.content == query.content) {
return true;
}
}
现在我知道这在实际情况下不会起作用,但是将它拆开有助于将功能中的多个功能分开。如前所述,return true;
语句仅适用于wordDo
函数,而不适用于shouldDoThis
函数。
一个好的解决方案可能涉及从wordDo
,sectionDo
返回一些内容,然后在shouldDoThis
中检查该内容。