JS传递作为全局对象实例一部分的函数完全忽略了实例本身

时间:2017-05-14 16:18:14

标签: 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);
            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为null,而在实例bst中它不是

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

我想要的只是一个Print函数接受一个函数,执行它然后将结果数字打印到页面而不是写三个单独的相同函数PrintInorder,{{1} }和PrintPreorder

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

1 个答案:

答案 0 :(得分:1)

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

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

然后调用该函数,您可以传递相应的参数:

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