2016-08-06 15 views
-2

簡単なものの一種。 "console.log(" test "、nn)})"という行が、なぜ値3ではなく定義されていないとしてnnを表示しているのかを説明するのを手伝ってもらえますか?ありがとうございました。コードスニペットは次のとおりです。JavaScript 'undefined'

function unless(test, then) { 
    if (!test) then(); 
} 
function repeat(times, body) { 
    for (var i = 0; i < times; i++) body(i); 
} 

repeat(3, function(n) { 
    var nn = unless(n % 2, function() { 
    return 1 * 3 
    }); 
    console.log("test", nn) 
}); 
+4

'unless()'は何も返しません。 – JJJ

+1

@Juhanaそのコメントは答えでなければなりません。 – Siguza

+1

この質問は、回答する代わりに閉じてください。 – JJJ

答えて

1

あなたを返します。 unless()関数は何も返しません。したがって

var nn = unless(...); 

nnがちょうどundefinedになることを意味します。 nnに値を設定するには、関数unless()が値を返す必要があります。ここで

function unless(test, then) { 
    if (!test) then(); 
} 

return文はありません。コールバックthen()は値を返すかもしれませんが、値をunless()の範囲内で使用できるようにするだけです。 unless()自身が値を返すようにするには、適切なreturn文を1つ以上追加する必要があります。例えば

、あなただけのようなthen()値を返すことによって、問題の一部を解決することができます:

function unless(test, then) { 
    if (!test) return then(); 
} 

しかし、あなたはまだtestがtruthyある場合の戻り値を必要としています。私は何をお勧めしたいのか分からないので、何をお勧めするのか分かりませんが、一般的な形式は次のようになります:

function unless(test, then) { 
    if (!test) { 
     return then(); 
    } else { 
     return somethingelse; // assign some return value when `test` is truthy 
    } 
} 
+0

ありがとうございます。それは有り難いです。これは非常に便利です –

1

あなたは、関数の結果からunless現在unless()戻りundefinedをNNを割り当てるしようとしているので、式の結果はundefinedです。

コールバック関数then()におけるリターンは、それがvar nnが返されるため、何にも未定義もたらすことを意味し、return文がありませんunless()の範囲に戻り、結果をキャプチャするnnのスコープではありません。この問題を解決するために

、あなたは、アルゴリズムの再帰部分を実行するときにunless()のスコープ内の変数に代入し、そのを返す必要があります:

function unless(test, then) { 
    var result = test; 
    if (!test) { 
     result = then(); 
    } 
    return result; 
} 
function repeat(times, body) { 
    for (var i = 0; i < times; i++) body(i); 
} 

repeat(3, function(n) { 
    var nn = unless(n % 2, function() { 
    return 1 * 3 
    }); 
    console.log("test", nn) 
}); 

今すぐ3, 1, 3

+1

@ZakariaAcharki違いはありません。 – Siguza

+1

@ZakariaAcharki JavaScript用ではありません。あなたは関数に "nothing"を渡し、それを 'undefined 'と比較することで、' '(nothing)' ' 'を返し、' true'を返します。したがって、「何もない」は「未定義」に等しくなります。 – Siguza

+0

@Siguzaは私の答えを修正しました。本当に定義されていないものは何も有効な点ではありません。 '未定義の場合は常に優雅に扱うことが常にベストですが、 – Alex

関連する問題