2016-09-22 16 views
0

条件が満たされた後、forループが続行される原因を知っている人はいますか?私はファイル全体を投稿するだろうが、それはかなり大きい。JS:forループは、条件が偽の後も繰り返し続けます。

for (var j = 0; j < depKeyArr.length; j++) { 
    var directory = angular.copy(dependencies[depKeyArr[j]]), 
     keyArr = angular.copy(Object.keys(directory)); 
    for (var i = 0; i < keyArr.length; i++) { 
     var next = i + 1;  

     if (keyArr[i] && !keyArr[i].includes('Params')) { 
      if (keyArr[next] && keyArr[next].includes('Params')) { 
       directory[keyArr[next]] = directory[keyArr[next]].split(', ') !== [''] ? directory[keyArr[next]].split(', ') : undefined 
       directory[keyArr[next]].push(directory[keyArr[i]]) 
      } 
      var paramArr = directory[keyArr[next]] ? directory[keyArr[next]] : directory[keyArr[i]] 
      switch (depKeyArr[j]) { 
       case 'controller': 
        angular.module('app').controller(keyArr[i], paramArr) 
        break 
       case 'directive': 
        angular.module('app').directive(keyArr[i], paramArr) 
        break 
       case 'factory': 
        angular.module('app').factory(keyArr[i], paramArr) 
        break 
       case 'filter': 
        angular.module('app').filter(keyArr[i], paramArr) 
        break 
       case 'service': 
        angular.module('app').service(keyArr[i], paramArr) 
        break 

      } 
     } 
    } 
} 
ので

depKeyArr.lengthこの特定のインスタンスが5に等しいで、そしてkeyArr.length両方のループのために、これらの条件は私がそれらを期待しているという事実にもかかわらず、満たされたときに実行し続ける42に等しい:ここではループがあります4と41で停止します。あなたが提供できるすべての助けがあれば、なぜ私は偉大になるのか理解することができます。

スニペットを上記で更新しました!

また、私は& jが変わったと言いましたが、私がデバッガで見ているときは変わりません。私は今それを見ています - j = 5とdepKeyArr.lengthは5です。同様に、i = 42とkeyArr.lengthは42です...しかし、私は両方のループの内側、特にswitch文の最後のケースです。 keyArr [i]が未定義のときは失敗します。

OBDMが提供する答えに応じて、ループ内からアレイを更新しないようにangular.copy()を追加しました。ブール条件が満たされても、ループにステップしています。さらに複雑になるのは、ifの条件でもスイッチの実行を妨げないという事実です。その後、keyArr[i]によって定義されていないので、

if (!keyArr[i].includes('Params')) 

:それは次のようifを入力して失敗します。

最新のアップデート -

私が正常に最新の変更と内側のループの外に壊れているようだが、それはまだswitch文に継続してkeyArr[i]で休憩すると、そのスイッチがループとの両方の範囲内であってもif falseと評価される条件。何

イムわからない:

+1

内側のループが繰り返し処理を続ける場合、外側のループも同じことをどのように知っていますか?あなたの外側のループに関しては、jは決して過去0にならないでしょうか? – JMK

+0

ラベル付きブレークを試してみてください:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/label –

+0

'i'と' j'は 'のために? – webgodo

答えて

0

は「?。条件が満たされた後、ループは、私はファイル全体をポストだろうが、それはかなり大きい継続するために、誰もが原因となるものを知っています、私のここでのループです」 "// blah blah more code"ですが、ここでは、変数iとjの値の変更を伴う操作は行われません。通常、i、j、k、l、およびもしあなたがそのbla blaの中に別のループを持っていて、無意識のうちにjを置くと、後で何が起こったのか分かります。

+0

もう少し説明できますか? "無意識のうちにjを置くと、後で何が起こったのか知っているからだ。"そこにはループはありませんが、スイッチがあります。私は意図的に 'i'や' j'を更新しませんでしたが、私はそれを探します。 – Kraken

+0

これはどのようなスイッチですか? iやjも更新しますか? –

1

一般的に言えば、ループの停止条件を "動的値 "すなわちcとなることができる値ループの繰り返し処理中にハングしました。同様のシナリオに遭遇することができる人のため

var depKeyArrLen = depKeyArr.length; 

for (var j = 0; j < depKeyArrLen; j++) { 
    depKeyArr.push("whatever"); 
} 
+0

良い点。私は配列を更新しています!それが修正されているかどうかを見てみましょう... – Kraken

+0

変数の長さを設定することについてのあなたの最新の点については、これまでにこれを行う必要はありませんでした。配列を値でコピーして、それがループしている配列が静的であるようにするのがより好都合です。 – Kraken

0

for (var j = 0; j < depKeyArr.length; j++) { 
    depKeyArr.push("whatever"); 
} 

なく不明動作から可変防止に停止条件を設定:

次のコードは、無限ループを生成しますこれは、プログラムがループ内の最後の角度サービスをアタッチできなかった場合に起こる奇妙な動作です。

私はそれを超え、最終的には大きな前進をして、前提に疑問を呈しました。私はループが正常に完了したと仮定していましたが、ループは成功しませんでした。それが答えでした。

関連する問題