2017-04-15 13 views
0

constwhileループをJSで使用することは可能ですか?我々は再帰関数を使用せずに、このような何かを行うことができる場合、私は疑問に思う:JavaScriptでwhileループでconstを使用する方法

const node = current; 
while (!found(node)) { 
    node = node.previous 
} 

は、彼らは関数型プログラミングのスタイルでそれをどのように行うのですか?

+3

http://stackoverflow.com/questions/31987465/ecmascript-2015-const-in-for-loops –

+0

あなたのコードで 'cur'と' node'が同じ変数であることを意味しましたか? – sepp2k

+0

申し訳ありませんが、編集中の私の間違いです –

答えて

1

番号constは定数を意味する。
constの値は、その呼び出しの有効期間中、これまで決して変更することはできません。

let cur; 
while (!found(cur)) { 
    node = node.previous; 
    // do stuff 
    cur = // ... 
} 

これでうまくいきます。

同様に

ここ
for (let i = 0; i < stuff.length; i += 1) { 
    const thing = stuff[i]; 
    // do stuff with a thing 
} 

のconstは、ループを通っている限り、単一の繰り返しのように住んでいます。
ループの外側では、すべての反復処理が繰り返されます。つまり、再作成されません。つまり、ループ全体(または関数の他の部分)から再割り当てすることはできません。定数。

しかし、どちらも特に機能しません。

再帰せずにFPを実行することは非常に可能ですが、これらの設定のどちらもそのような設定を行う方法ではありません。 map/filter/reduceについて学ぶことをお勧めします。また、維持しているコードの内部で状態の変化を避けるために、これらのテクニックをサポートする構造化コレクションのパターンも考えてください。 const(再割当て時に投げられる)を持つループはそれを実行しないためです。

2

ファンクションスタイルではwhileループを使用しないため、唯一の方法は再帰を使用することです。あなたのnodecurrent、前のフィールドを持つオブジェクトである場合には、より多くの「機能的」な方法は何をするだろう。そして、

function find(startNode) { 
    if (!found(startNode)) { 
     if (startNode.previous) { 
     return find(startNode.previous) 
     } else { 
     return null 
     } 
    } else { 
     return startNode 
    } 
} 

と初期ノード上findを呼び出します。

関連する問題