在JavaScript中调用对象递归函数

时间:2018-09-24 09:43:52

标签: javascript jquery

我是Java语言的新手。我有一个JavaScript类,可以在内部调用递归。 但是运行时出现错误:

  

$(...)。display不是$(item).display(false);的功能

这是我的代码:

function ScopeData(table, parentRow) {
const tableData = table;
const scopeEl = parentRow;
var childScope = [];
var childRows = [];

this.display = function aa(isDisplay) {
    childRows.each(function (index, el) {
        if (isDisplay) {
            $(el).removeClass("hidden");
        }
        else {
            $(el).addClass("hidden");
        }
    });

    if (!isDisplay) {
        var display1 = this.display;
        for (let i = 0; i < childScope.length; i++) {
            const item = $(childScope)[i];
            $(item).display(false);
        }
    }
}

this.findChildRow = function () {
    var scope = $(scopeEl).data("scope")
    childRows = $(tableData).find("tr[data-parent='" + scope + "']");
}

this.createChildScope = function () {

    $(childRows).each(function (index, el) {
        var scope = $(el).data("scope")
        if (scope !== "" && scope !== undefined) {

            var childRows = $(tableData).find("tr[data-parent='" + scope + "']");
            var dataRow = new ScopeData(table, $(el));
            dataRow.init();

            childScope.push(dataRow);
        }
    });
}

this.init = function () {
    var display = this.display;
    this.findChildRow();

    this.createChildScope();

    $(scopeEl).find("i").on("click", function () {
        display(false);
    })
}

}

请帮助我解决此问题。 预先感谢

1 个答案:

答案 0 :(得分:0)

欢迎使用JavaScript,以及如何评估this关键字。我强烈建议您在继续之前先阅读this,因为它是javascript核心概念之一。解决问题的一种方法是:

this分配到变量中,并使用它。

function ScopeData(table, parentRow) {
    var self = this;
    ...
    this.init = function () {
      var display = self.display;

一种更干净的方法是绑定任何现代浏览器支持的功能。

this.display = function aa(isDisplay) {
    childRows.each(function (index, el) {
        if (isDisplay) {
            $(el).removeClass("hidden");
        }
        else {
            $(el).addClass("hidden");
        }
    });

    if (!isDisplay) {
        var display1 = this.display;
        for (let i = 0; i < childScope.length; i++) {
            const item = $(childScope)[i];
            $(item).display(false);
        }
    }
}

this.display = this.display.bind(this);