【问题标题】:Why is function return value undefined when returned in a loop?为什么在循环中返回时函数返回值未定义?
【发布时间】:2012-08-08 23:09:57
【问题描述】:

我不知道为什么会这样。

以下函数总是返回 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;
    }

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

【问题讨论】:

    标签: javascript jquery


    【解决方案1】:

    $.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;
        }
    

    【讨论】:

      【解决方案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
      

      }

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          【解决方案4】:

          您是从内部函数返回,而不是外部函数。这就是外部函数返回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/

          【讨论】:

          • jquery 中的 .each 不响应被调用函数内部的中断或延续。如果要模拟break;,请使用return false;。要模拟continue;,请使用return true;
          【解决方案5】:

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

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

              【解决方案7】:

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

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

              函数中的内容:

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

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

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

              【讨论】:

                【解决方案8】:

                来自jQuery .each() docs

                我们可以在特定的迭代中打破 $.each() 循环,方法是 回调函数返回假。返回非 false 与 a 相同 for 循环中的 continue 语句;它会立即跳到下一个 迭代。

                【讨论】:

                  猜你喜欢
                  • 2020-03-28
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2020-05-07
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多