2017-02-12 4 views
0

それは次のように私は、新しいオブジェクトを宣言:なぜこのオブジェクトを関数で使用するとJavascript TypeError(undefined)が発生しますか?

function node(){ 
       this.tag  = null; 
       this.Tdata  = []; 
       this.Tchilds = []; 
} 

私は関数の中で、このオブジェクトを使用したい:

function Check(root /*I want to use root as type node*/) { 
     for(var i = 0; i < root.Tdata.length; i++){ 
       if(root.Tdata[i] == -1) 
         arg++; 
     } 
} 

ブラウザは言う:TypeError: root.Tdata is undefined

私は変数を宣言する場合(関数のスコープの外)var root = new node(); &私はroot.Tdata[]を使用してすべて正常に動作します。

どうすればこのオブジェクトを関数で使用できますか?

EDIT:
私は、関数呼び出し時:

var rootExt = new node(); 
    rootExt.Tdata[0] = -1; 
    rootExt.Tchilds[0] = -1; 

    Check(rootExt); 
+3

どのように 'Check'関数を呼び出していますか?私はあなたのコードを次のようにテストしました: 'Check(new node());'そして期待どおりに動作します。 – maddockst

+0

新しい演算子に関するドキュメントを読むべきです。[here](https://developer.mozilla.org/en/US/docs/Web/JavaScript/Reference/Operators/new) – puemos

+2

オブジェクトを関数に渡す必要があります'Check(new node());' –

答えて

3

あなたはnew演算子を使用してNodeオブジェクトをインスタンス化する必要があり、その後、そのインスタンス化されたオブジェクトをcheck関数の呼び出しに渡します:

function Node() { 
    this.tag = null; 
    this.Tdata = []; 
    this.Tchilds = []; 
} 

function check(root) { 
    for(var i = 0; i < root.Tdata.length; i++) { 
    if(root.Tdata[i] == -1) { 
     arg++; 
    } 
    } 
} 

var rootNode = new Node() //instantiate a new Node 
check(rootNode) //invoke check function with rootNode as argument 
+0

arg ++はどこから来ますか? – abc123

+0

不明 - 元のコードで参照されています。しかし、手元の問題に関連するとは思わない – hackerrdave

-2

あなたがこれを行うことができます:

var root = { 
    tag: null, 
    Tdata: [], 
    TChild: [] 
} 



function Check() { 
     for(var i = 0; i < root.Tdata.length; i++){ 
       if(root.Tdata[i] == -1) 
         arg++; 
     } 
    } 
+0

しかし、私はノード型の他の変数を宣言する必要があります! –