如何通过传递此调用递归函数

时间:2019-01-17 00:25:29

标签: javascript jquery

在运行下面的代码时,我遇到了浏览器崩溃的问题。当我在其内部递归调用函数“ montarMenu.call(this);”时,会出现问题。 如何正确调用该函数。

var SISTEMA = SISTEMA || {};

SISTEMA.MenuPrincipal = (function() {

    function MenuPrincipal() {  
        this.sidebar = $("#sidebarnav");
        this.listaMenuJSON = [];
        this.strHTML = "";
        this.indice = 0;        
    }

    MenuPrincipal.prototype.iniciar = function() {      
        getJSON.call(this);
    }   

    function getJSON() {
        var resposta = $.ajax({
            url: '/menus',
            method: 'GET',
            contentType: 'application/json'  
        });
        resposta.done(onMontarMenuCarregado.bind(this));    
    }

    function onMontarMenuCarregado(JSON) {
        this.listaMenuJSON = JSON;

        while (this.indice < this.listaMenuJSON.length) {           
            if (this.listaMenuJSON[this.indice].menuPai == null) {              
                montarMenu.call(this);              
            }           
            this.indice++; 
        }                   

        this.sidebar.html(this.strHTML);        
    }       

    function montarMenu() {                     
        var itemMenu = this.listaMenuJSON[this.indice];             
        var numeroColunas = ((itemMenu.numeroColunas == null || !itemMenu.numeroColunas.trim()) ? "" : " class='"+itemMenu.numeroColunas+"'");

        this.strHTML = "<li"+numeroColunas+">";     
        if (itemMenu.menuPai == null) {         
            this.strHTML+="<a class='has-arrow' href='"+((itemMenu.url == null || !itemMenu.url.trim()) ? '#' : itemMenu.url)+"' aria-expanded='false'><i class='mdi "+itemMenu.icone+"'></i>";
            this.strHTML+="<span class='hide-menu'>"+itemMenu.nome+" </span>";
        } else {
            this.strHTML+="<a class='has-arrow' href='#' aria-expanded='false'>";
            this.strHTML+=itemMenu.nome;
        }           
        this.strHTML+="</a>";
        this.strHTML+="<ul aria-expanded='false' class='collapse'>";

        this.indice++;
        while (this.indice < this.listaMenuJSON.length) {
            if (this.listaMenuJSON[this.indice].menuPai == null) {
                break;
            }                       

            if (itemMenu.id == this.listaMenuJSON[this.indice].menuPai.id  && this.listaMenuJSON[this.indice].possuiSubmenu == false) {                 
                this.strHTML+="<li><a href='"+((this.listaMenuJSON[this.indice].url == null || !this.listaMenuJSON[this.indice].url.trim()) ? '#' : this.listaMenuJSON[this.indice].url)+"'>"+this.listaMenuJSON[this.indice].nome+"</a></li>";
            } else {                    
                if (this.listaMenuJSON[this.indice].possuiSubmenu == true) {
                    montarMenu.call(this);
                }
            }   
        }       

        this.strHTML+="</ul>";
        this.strHTML+="</li>";
    }

    return MenuPrincipal;

}());

$(function() {

    var menuPrincipal = new SISTEMA.MenuPrincipal();
    menuPrincipal.iniciar();

});

1 个答案:

答案 0 :(得分:0)

如果要调用一个函数,就像调用任何其他函数一样调用它:

montarMenu(this);