为什么这总是返回false(嵌套for循环)

时间:2013-09-12 17:59:19

标签: javascript jquery

这很简单:

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。我做错了什么?

2 个答案:

答案 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函数。

一个好的解决方案可能涉及从wordDosectionDo返回一些内容,然后在shouldDoThis中检查该内容。