2016-08-10 2 views
0

これは私の子を追加するための私の関数です。フラグを指定すると、子を一度追加します。フラグがなければ、無限ループに入ります。フラグはグローバルです。Javaスクリプトが再帰的に子を追加すると、無限ループで終了する

function addChildToParent(node, parent, child) { 
    if (node.name == parent) { 
     node.add(child); 
     flag = true; 
    } 
    else if (flag==false){ 
     for (i = 0; i < node.children.length; i++) { 
      addChildToParent(node.getChild(i), parent, type, child); 
     } 
    } 
} 

それはここと呼ばれている、なめらかの長さは、上記3.

request.onload = function() { 
     var ecs=[]; 
     for(i=0;i<smth.length;i++){ 
      ecs[i]= new Node(smth[i],EC); 
      flag=false; 
      addChildToParent(node,smth[i],ecs[i]); 
     }   
}; 

機能が2回呼び出されているです。 質問は間違っていますか?

+0

'flag'はvarなしで定義しているので、グローバルです。それを 'true'に設定すると常に' true'になります。おそらくもっとわかりやすい名前を付けるべきでしょう。行の混乱を避けるために '==='を '=='に使用してください。 – Olical

+1

forループ内の 'i'はグローバル変数でもなく、残りのコードも分かりませんが、forループがあれば上書きすることができます。 – zer00ne

+0

ありがとうzer00ne、それは今完全に動作します。 – dreadnightmare

答えて

0

おかげで以下のようなあなたのelse if条件に別の条件を追加する必要がありますどちらか。 変数ifor)は、var iと一緒に使用する必要があります。ローカル変数ではなくグローバル変数なので、何らかの方法で上書きされます。

for (var i = 0; i < node.children.length; i++) { 
      addChildToParent(node.getChild(i), parent, type, child); 
     } 

問題を修正します。

0

あなたはelseelse ifを交換するか、私は問題をINDENTIFIEDしている私のポストのzer00neコメントへ

function addChildToParent(node, parent, child) { 
    if (node.name == parent && flag !==false) { 
     node.add(child); 
     flag = true; 
    } 
    else if (node.name !== parent && flag == false){ 
     for (i = 0; i < node.children.length; i++) { 
      addChildToParent(node.getChild(i), parent, type, child); 
     } 
    } 
} 
関連する問題