为什么在循环中返回时函数返回值是未定义的?

时间:2012-08-08 14:48:53

标签: javascript jquery

我无法弄清楚为什么会这样。

以下函数始终返回undefined。即使满足条件并且应该返回一个值。

这是answerCollection变量的一个实例。

[
Object
Answer: "2"
AnswerText: undefined
OpsID: "24"
PprID: "2"
Question: "How many colors?"
__proto__: Object
]

function GetAnswerForProcessQuestion(pprID)
    {
        $.each(answerCollection, function (index, item)
        {
            var thisPprID = item["PprID"];
            if (thisPprID == pprID)
            {
                var answer = item["Answer"];
                return answer;
            }
        });
    }

但是,如果我在循环中设置一个变量,那么一旦循环完成执行就返回该变量,返回正确的值。

function GetAnswerForProcessQuestion(pprID)
    {
        var answer;
        $.each(answerCollection, function (index, item)
        {
            var thisPprID = item["PprID"];
            if (thisPprID == pprID)
            {
                answer = item["Answer"];
            }
        });
        return answer;
    }

关于为什么我不能从循环内部返回值的任何想法?

8 个答案:

答案 0 :(得分:4)

$.each返回值不会返回父函数中的值。试着这样做:

function GetAnswerForProcessQuestion(pprID)
    {
        var answer;
        $.each(answerCollection, function (index, item)
        {
            var thisPprID = item["PprID"];
            if (thisPprID == pprID)
            {
                answer = item["Answer"];
                return false; // break loop
            }
        });
        return answer;
    }

答案 1 :(得分:2)

很简单,因为返回值在运行函数之外或之内。 我建议你使用java-script default-each code:

function GetAnswerForProcessQuestion(pprID)
{

    for (var i in answerCollection){  // note that answerCollection must be defined
                                      // globaly or passed in
        var thisPprID = answerCollection[i]["PprID"];
        if (thisPprID == pprID) //checking if it's the value 
        {
           return answerCollection[i]["Answer"]; //if the condition is true return it
        }
    }
    return false; // if you find nothing you end up here

}

函数内定义的变量可以访问该函数内的任何其他函数,但不能访问外部。意思是:

function somefunction(){
  var test='the value';
  function testing(){ alert(test); } //will alert 'the value' since the variable was
  testing();                         //defined in the functions scope

  function testing(){
                     var test=1;//the test ins now defined under the function testing()
                    }

  alert(test); //will alert 'undefined' since it was not defined in the global scope

}

答案 2 :(得分:1)

jquery中的.each不会返回从您调用的函数返回的值。它会回复return true;return false;,分别模拟continue;break;。此外,.each永远不会返回值。因此,永远不会传递从被调用函数返回任何其他内容。

您的第二个表单的工作原因是由于变量范围的方式。由于变量是在由.each调用包装的函数的父元素中声明的,因此可以在函数内部访问它并进行设置。它的范围属于父级的事实允许它在该父级中被读取和返回。

答案 3 :(得分:0)

您正在从内部函数返回,而不是从外部函数返回。这就是外部函数返回underfined的原因,因为这是默认值。

您可以使用return false;立即结束每个循环,然后返回结果。

function GetAnswerForProcessQuestion(pprID)
{
    var answer;
    $.each(answerCollection, function (index, item)
    {
        var thisPprID = item["PprID"];
        if (thisPprID == pprID)
        {
            answer = item["Answer"];
            return false;
        }
    });
    return answer;
}

http://jsfiddle.net/mN5B3/

答案 4 :(得分:0)

$。每个都是它自己的函数,注意$ .each(answerCollection,function(index,item)

你回来了,而不是父母。

答案 5 :(得分:0)

循环具有匿名功能。当你返回时,你从那个内部函数返回并继续循环。

你应该设置变量,然后从内部函数返回false(这将打破每个循环),然后从外部函数返回变量。

答案 6 :(得分:0)

您代码中$.each内的回调定义如下:

function callback(index, item)
{
    var thisPprID = item["PprID"];
    if (thisPprID == pprID)
    {
        var answer = item["Answer"];
        return answer;
    }
}

在功能中:

function GetAnswerForProcessQuestion(pprID)
{
    $.each(answerCollection, callback);
}

这意味着在top函数中,没有任何反应!对于每个项目,您计算一些东西,它会保持在循环内。

在第二段代码中,您 保存 外部函数范围的答案。这样,外部函数可以返回它。

答案 7 :(得分:0)

来自jQuery .each() docs

  

我们可以在特定的迭代中打破$ .each()循环   回调函数返回false。返回非假是与a相同   在for循环中继续声明;它将立即跳到下一个   迭代。