3

なぜこれが起こっているのかわかりません。

次の関数は常に 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;
    }

ループ内から値を返せない理由について何か考えはありますか?

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 スクリプトのデフォルトの 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が値を返すことはありません。したがって、呼び出された関数から他のものを返すことは決して渡されません。

2番目のフォームが機能する理由は、変数のスコープの方法によるものです。変数は.each呼び出しによってラップされている関数の親で宣言されているため、関数内でアクセス可能であり、設定できます。スコープが親に属しているという事実により、そのスコープを読み取ってその親で返すことができます。

于 2012-08-08T15:09:57.073 に答える
0

jQuery .each() ドキュメントから:

コールバック関数が false を返すようにすることで、特定の反復で $.each() ループを中断できます。false 以外を返すことは、for ループの continue ステートメントと同じです。次の繰り返しにすぐにスキップします。

于 2012-08-08T15:00:06.643 に答える
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 を返し (これにより each ループが中断されます)、外側の関数から変数を返す必要があります。

于 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);
}

つまり、一番上の関数では何も起こりません! アイテムごとに何かを計算し、ループ内にとどまります。

2 番目のコードでは、答えを外側の関数のスコープに保存します。そうすれば、外側の関数はそれを返すことができます。

于 2012-08-08T14:51:50.860 に答える