2016-11-24 4 views
1

У меня есть следующий класс JavaScript:Максимальный размер стека вызовов превысил - бесконечный цикл

class TrieNode 
    { 
     constructor() 
     { 
      switch(arguments.length) 
      { 
       case 0 : this.constructorNoParam(); 
         break; 
       case 1 : this.constructorOneParam(arguments[0]); 
         break; 
      } 
     } 

     constructorOneParam(c) 
     { 
      this.children=new TrieNode(); 
      this.c = c; 
      this.isLeaf; 
     } 

     constructorNoParam() 
     { 
      this.children = new TrieNode(); 
      this.c; 
      this.isLeaf; 
     } 
    } 

Причина, почему я получаю эту ошибку в том, что каждый раз, когда я создаю переменную children, конструктор создает еще один экземпляр класса TrieNode и приводит к бесконечному циклу.

Есть ли способ, которым я могу создать только ОДНУ переменную для всего класса? Мне пришлось поместить его в конструктор, поскольку в классах JavaScript переменные могут создаваться только внутри функций.

В общем, что я хочу добиться будет выглядеть в Java:

public class TrieNode { 

     public char c; 
     TrieNode children = new TrieNode(); 
     public boolean isLeaf; 

     public TrieNode() {} 

     public TrieNode(char c){ 
      this.c = c; 
     } 

Благодарности

+0

Возможный дубликат [Максимальный размер стека вызовов превысил ошибки] (http://stackoverflow.com/questions/ 6095530/maximum-call-stack-size-above-error) –

+0

Это все еще не решает мою проблему – Techs

ответ

1

Вы можете создать статическую переменную для этого,

class TrieNode { 
    constructor(time) { 
     if(time === "1") return; 
     switch(arguments.length) { 
     case 0 : this.constructorNoParam(); 
     break; 
     case 1 : this.constructorOneParam(arguments[0]); 
     break; 
     } 
    } 
    constructorOneParam(c) { 
     this.children= TrieNode.children; 
     this.c = c; 
     this.isLeaf; 
    } 
    constructorNoParam() { 
     this.children = TrieNode.children; 
     this.c; 
     this.isLeaf; 
    } 
} 

TrieNode.children = new TrieNode("1"); 

// Now the code wont fall into a recursive loop 
var x = new TrieNode(); 
var y = new TrieNode("foo", "bar"); 

И создать резерв в первый раз.


в качестве альтернативы Вы можете сделать это, как показано ниже, если вы хотите новый экземпляр для детей,

class TrieNode { 
     constructor(time) { 
      if(time === "1") return; 
      switch(arguments.length) { 
      case 0 : this.constructorNoParam(); 
      break; 
      case 1 : this.constructorOneParam(arguments[0]); 
      break; 
      } 
     } 
     constructorOneParam(c) { 
      this.children= new TrieNode("1"); 
      this.c = c; 
      this.isLeaf; 
     } 
     constructorNoParam() { 
      this.children = new TrieNode("1"); 
      this.c; 
      this.isLeaf; 
     } 
    } 
+0

Это по-прежнему приводит к той же ошибке – Techs

+0

@Techs Можете ли вы дифференцировать вызов для установки в первый раз? –

+0

Я думал об этом. Но я не могу придумать, как я могу это сделать – Techs