0

あてもなく遊んでいて、わからないものに出くわしました。

var result;
// [.............. more stuff ..............]
function iterate(n) {
 if (isDivisor(n)) {
   if (checkIfPrime(n)) {
        result = n;
        return result;
   }
   iterate(n-2);
 }
 iterate(n-2);
}

result = iterate(startN)
console.warn("result is ", result)

//(isDivisor() and checkIfPrime() omitted because irrelevant to the problem

したがって、期待値に達すると再帰が停止するという制限的な意味で、コードは正常に機能します。しかし!私が得るコンソールでundefinedresultはグローバルであり、関数内、特に 内では再宣言されませんiterate()n返されたときに正しい値を持っていiterate()ます。iterate()グローバルスコープにアクセスできます(そしてそこに住んでいます)では、どうすればundefined...という結果になるのでしょうか?

私はおそらく選択的な盲目の攻撃を受けているだけですが、スコープがどこで迷うのか本当にわかりません.

4

2 に答える 2

4

関数は未定義を返し、その結果を結果変数に代入しています。

関数から結果を返す必要があります。

function iterate(n) {
 if (isDivisor(n)) {
   if (checkIfPrime(n)) {
        return n;
   }
   return iterate(n-2);
 }
 return iterate(n-2);
}

var result = iterate(startN);
console.log(result);
于 2012-09-23T16:04:28.833 に答える
3

Javascript 関数が return ステートメントに到達せずに終了した場合、その戻り値は になりますundefinedisDivisor(n)これは、 とcheckIfPrime(n)の両方が trueでない限り、関数に発生します。

するつもりだったのかもしれません

function iterate(n) {
 if (isDivisor(n)) {
   if (checkIfPrime(n)) {
        result = n;
        return result;
   }
   return iterate(n-2); // <----
 }
 return iterate(n-2); // <----
}

代わりは?

于 2012-09-23T16:03:49.667 に答える