Javascript JS传递作为全局对象实例一部分的函数时,会完全忽略该实例本身

Javascript JS传递作为全局对象实例一部分的函数时,会完全忽略该实例本身,javascript,object,parameter-passing,Javascript,Object,Parameter Passing,我有一个二进制搜索树的对象,它有以下函数 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);

我有一个二进制搜索树的对象,它有以下函数

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>
现在问题就出现在这里,当我跟踪this时,this
Print
函数返回一个空数组。函数中的root为null,而在实例中
bst
中则不是

function Print(traversal) {
    var numbers = traversal();
    msg.innerHTML = numbers.join(', ');
}
我想要的是只有一个
Print
函数,它接受一个函数,执行它,然后将生成的数字打印到页面上,而不是编写三个独立的相同函数
PrintInorder
PrintPreorder
PrintPostorder


我不明白为什么会这样。我正在传递
bst.inoder
,因此传递的函数必须具有实例
bst
的根(
this.root
),但它只是空的。

您可以定义函数,以便接受函数作为第一个参数,接受被调用函数的上下文作为第二个参数:

function Print(myFn, context) {
    myFn.call(context, context.root);
}
然后调用函数,您可以传递相应的参数:

<button type="button" onclick="Print(bst.inorder, bst);">Inorder</button>
有序
<button type="button" onclick="Print(bst.inorder, bst);">Inorder</button>