2017-05-14 48 views
0

我有具有以下功能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函數返回一個空數組,當我追查this.root裏面的函數爲空,而在實例bst事實並非如此。

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

我想是隻有一個Print函數,它的功能,執行它,然後將結果打印號碼的頁面,而不是寫三個獨立的相同功能PrintInorderPrintPreorderPrintPostorder

我不明白爲什麼會發生這種情況。我正在通過bst.inorder,所以傳遞的函數必須具有實例bst的根(this.root),但實際上它只是空值。

回答

1

您可以定義功能,以接受一個函數作爲第一個參數,調用函數作爲第二個參數的情況下:

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

然後invocating的功能,您可以通過相應的參數:

<button type="button" onclick="Print(bst.inorder, bst);">Inorder</button> 
相關問題