2016-04-22 5 views
0

コンテキストの場合、私はnpmパッケージunique-randomを見ています。これは、コードのわずか8ラインなので、それで全部だ:この `return`ステートメントを説明しますか?

'use strict'; 
module.exports = function (min, max) { 
    var prev; 
    return function rand() { 
     var num = Math.floor(Math.random() * (max - min + 1) + min); 
     return prev = num === prev && min !== max ? rand() : num; 
    }; 
}; 

は、私はちょうど最後のreturn文が何をしているのか、非常にわからないんだけど、何が起こっているのほとんどを理解しています。

誰かがそれをできるだけ明示的に説明することができますか(私はJavaScriptと一般的なコーディングにはまったく新しいです)。

おそらく、returnの文では、と表示されていることに関する一般的な質問かもしれません。? そうですか?

したがって、条件付き演算子があります。 ?の左側にあるものが真である場合、:の左側にあるもの、それ以外のものは:の右側にあります。したがって、num === prevmin !== maxの場合はrand()prevに、それ以外の場合はnumprevに割り当てますか?

そうですか?

+1

この乱数は乱数が生成された前回と同じであるかどうかを確認するために乱数が、小切手を作成します。実際に前回と同じ番号であれば 'rand()'をもう一度呼び出し、そうでなければ 'num'を返します。 – h2ooooooo

+0

あなたは正解で何が@ h2ooooooo ^と言った。 – BenG

+0

誰かが 'prev = num === num'条件がどのように働くべきかを記述できますか?私はそれが「真実」以外の何かに評価される方法は見当たりません – Aaron

答えて

3

基本的には、このモジュールは関数を返す:あなたはこのモジュールをインポートするとき

module.exports = function() { 
    return function rand() { 
     // stuff 
    }; 
}; 

だから、あなたは何を得る呼び出す必要があります:

var rand = import('./rand'); 
rand(); // stuff 

そして、rand関数は、2つの部分があります

var num = Math.floor(Math.random() * (max - min + 1) + min); 

minとmaxの間のランダム値を計算します。

return prev = num === prev && min !== max ? rand() : num; 

新しいnumが前回と同じではないことを確認し、あなたは次のようにそれを見ることができる前に新しい値を保存します。

if (num === prev && min !== max){ 
    prev = rand(); 
} else { 
    prev = num; 
} 
return prev; 

私はprev変数であることを追加しますモジュールのクロージャではrandの範囲からアクセスできるので、randへの各呼び出しには新しいprevという値が設定されます。

これはブラケットを使用することができ、コードの完璧な例です

0

(これは厳密に同じコードを話していないですが、それは同じことを行う必要があります)。それが明確になるだろうこれは、次のように 同じことが書かれてすることができます:あなたが説明したとおりに動作します:

return prev = (num === prev && min !== max)? rand() : num; 

これは代入と三項演算(?Z XY)が含まれています。Xが真である場合、他YZ。それがさらに明確にする可能性のある次のように

これは、すべて記述できます。

if (num === prev && min !== max){ 
    prev = rand(); 
} 
else { 
    prev = num; 
} 
return prev; 
関連する問題