2017-05-14 11 views
0

Iは、以下の機能JS完全にインスタンス自体

function BSTAVL() { 
    /* 
    Other functions not related to the question 
    */ 
    this.inorder = function(cur = this.root) { 
     var numbers = []; 
     if (cur != null) { 
      numbers = this.inorder(cur.left); 
      numbers.push(cur.value); 
      numbers = numbers.concat(this.inorder(cur.right)); 
     } 
     return numbers; 
    } 

    this.preorder = function(cur = this.root) { 
     var numbers = []; 
     if (cur != null) { 
      numbers = [cur.value]; 
      numbers = numbers.concat(this.preorder(cur.left)); 
      numbers = numbers.concat(this.preorder(cur.right)); 
     } 
     return numbers; 
    } 

    this.postorder = function(cur = this.root) { 
     var numbers = []; 
     if (cur != null) { 
      numbers = numbers.concat(this.postorder(cur.left)); 
      numbers = numbers.concat(this.postorder(cur.right)); 
      numbers = [cur.value]; 
     } 
     return numbers; 
    } 
} 

var bst = new BSTAVL(); 

this.rootを有するバイナリ検索ツリーのオブジェクトを有するルートを表すノードオブジェクトで無視木の

とhtmlファイルで、私は以下のボタンを持っている

<button type="button" onclick="Print(bst.inorder);">Inorder</button> 
<button type="button" onclick="Print(bst.preorder);">Preorder</button> 
<button type="button" onclick="Print(bst.postorder);">Postorder</button> 
<br> 
<span id="msg"></span> 

この機能は期待通りに動作します。

function PrintInorder() { 
    var numbers = bst.inorder(); 
    msg.innerHTML = numbers.join(', ') 
} 

今、この問題が発生する場合、このPrint関数Iインスタンスbstではないが関数内this.rootは、ヌルであったことをトレースし、空の配列を返しています。

function Print(traversal) { 
    var numbers = traversal(); 
    msg.innerHTML = numbers.join(', '); 
} 

私が欲しいの代わりに、3つの別々の同一機能PrintInorderPrintPreorderPrintPostorder

Iを書くのページへの結果の数字を、関数を受け取り、それを実行し、印刷しますちょうど1 Printの機能を持つことですそれがなぜ起こるのか理解していない。私はbst.inorderを渡しているので、渡された関数はインスタンスbstのルート(this.root)を持たなければならず、代わりにnullにすぎません。

答えて

1

あなたは2番目のパラメータとして最初のパラメータと呼ばれる関数のコンテキストとしての機能を受け入れるために、あなたの関数を定義することができます

function Print(myFn, context) { 
    myFn.call(context, context.root); 
} 

は、その後、あなたが対応するパラメータを渡すことができる機能をinvocating

<button type="button" onclick="Print(bst.inorder, bst);">Inorder</button> 
関連する問題