3

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

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

这是 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;
    }

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

4

8 回答 8

5

从返回值$.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;
    }
于 2012-08-08T14:52:06.603 回答
2

很简单,因为返回值在运行函数的外部或内部。我建议您使用 java-script 默认 for-each 代码:

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

}

于 2012-08-08T14:54:16.313 回答
1

jquery 中的 .each 不返回从您调用的函数返回的值。它分别响应return true;return false;作为模拟continue;和的一种方式break;。此外, .each 从不​​返回值。因此,从您调用的函数返回任何其他内容将永远不会被传递。

您的第二种形式起作用的原因是由于变量范围的方式。由于该变量是在被 .each 调用包装的函数的父函数中声明的,因此它可以在函数内部访问并且可以设置。它的范围属于父级这一事实允许在该父级中读取和返回它。

于 2012-08-08T15:09:57.073 回答
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/

于 2012-08-08T14:51:22.830 回答
0

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

你从那里回来,而不是父母。

于 2012-08-08T14:51:42.440 回答
0

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

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

于 2012-08-08T14:51:44.377 回答
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);
}

这意味着在顶部函数中,什么也没有发生!对于每个项目,你计算一些东西,它会留在循环中。

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

于 2012-08-08T14:51:50.860 回答
0

来自jQuery .each() 文档

通过使回调函数返回 false,我们可以在特定迭代中打破 $.each() 循环。返回非 false 与 for 循环中的 continue 语句相同;它将立即跳到下一次迭代。

于 2012-08-08T15:00:06.643 回答