为什么我需要使用2个函数,但不仅仅是一个函数

时间:2013-01-18 07:35:47

标签: javascript jquery ajax json

我粘贴了所有代码,因为它可能与我要求的功能有关。我帮忙让我的一个功能运行。查看parseJSON()函数。为什么我必须使用2个函数(parseJSON()和嵌套makeNav(navigation)),但不仅仅有一个parseJSON(navigation)(和ofc将内部元素从makeNav更改为parseJSON)。有人可以解释为什么它对我来说只是这样。因为我想要理解它,不仅仅是为了锻炼而继续下去。

    var new_json;
    $.get('navigation.json', function (json){
        new_json = json;
        parseJSON();

        var reload_page;
        var this_hash = window.location.hash;

        if( this_hash.length == 0 ){
            reload_page = "home";
        }else{
            reload_page = this_hash.replace('#', '');
        };

        loading(reload_page + '.html');
    });

    var cache = {};

    function loading(url){


        if( typeof(cache[url]) == 'undefined' ) {
            console.log( 'cache A does not exists' );

            container.load(url + ' .container>*', function(){

                cache[url] = container.html();          
            });
        }else {
            console.log( 'cache A exists' );

            container.html(cache[url]);
        };
    };

    $('#navigation li a, #logo a').live('click',function(){

        var url = $(this).attr('href');

        window.location.hash = url.replace('.html', '');

        loading(url);

        return false;
    });




    function parseJSON() {

        function makeNav(navigation) {
            var nav_html = '';
            console.log( navigation.length );
            for (var i = 0; i < navigation.length; i++) {
                var name = navigation[i]['name'];
                var href = navigation[i]['href'];
                var submenu = navigation[i]['navigation'];

                nav_html += '<li><a href="' + href + '">' + name + '<span class="ddArrow"></span></a>';     

                if( typeof(submenu) != 'undefined' ){
                    nav_html += '<ul>';
                    nav_html += makeNav(submenu);
                    nav_html += '</ul>';
                }
                nav_html += '</li>';
            }
            return nav_html;
        }
        $('#navigation ul').html(makeNav( new_json['navigation'] ));
    }

1 个答案:

答案 0 :(得分:2)

可能原因是您的parseJSON执行了额外的操作:$('#navigation ul').html(makeNav( new_json['navigation']));,当您对makeNav进行递归调用时,您无需设置此html内容。 makeNavparseJSON的嵌套定义的原因可能是您不希望makeNavparseJSON范围之外显示,因为您根本不使用它超出了这个范围,你不想污染“环境”。

无论如何,我真的不认为这是实施它的最佳方式......但应该在https://codereview.stackexchange.com/进行讨论。

要使用单个函数,不使用嵌套的makeNav,您可以执行以下操作:

var new_json;
$.get('navigation.json', function (json){
    new_json = json;
    parseJSON();

    var reload_page;
    var this_hash = window.location.hash;

    if( this_hash.length == 0 ){
        reload_page = "home";
    }else{
        reload_page = this_hash.replace('#', '');
    };
    loading(reload_page + '.html');
});

var cache = {};

function loading(url){
    if( typeof(cache[url]) == 'undefined' ) {
        console.log( 'cache A does not exists' );
        container.load(url + ' .container>*', function(){
                cache[url] = container.html();          
        });
    }else {
        console.log( 'cache A exists' );
        container.html(cache[url]);
    };
};

$('#navigation li a, #logo a').live('click',function(){
    var url = $(this).attr('href');
    window.location.hash = url.replace('.html', '');
    loading(url);
    return false;
});




function makeNav(navigation) {
    var nav_html = '';
    console.log( navigation.length );
    for (var i = 0; i < navigation.length; i++) {
        var name = navigation[i]['name'];
        var href = navigation[i]['href'];
        var submenu = navigation[i]['navigation'];

        nav_html += '<li><a href="' + href + '">' + name + '<span class="ddArrow"></span></a>';     

        if( typeof(submenu) != 'undefined' ){
            nav_html += '<ul>';
            nav_html += makeNav(submenu);
            nav_html += '</ul>';
        }
        nav_html += '</li>';
    }
    return nav_html;
}