JavaScript揭示模块模式重新分解建议

时间:2011-06-08 10:10:07

标签: javascript jquery design-patterns refactoring

我正在使用带有JavaScript的揭示模块模式在我当前的项目中组织我的代码,但我想知道我是否可以更好地使用它,因为我似乎创建了许多私有方法,然后在一个私有方法中调用它们线性方式,即当一个方法执行其操作然后调用另一个方法然后调用另一个方法,依此类推。

代码可以工作,但是想知道它是否可以更好,更高效或用更少的代码来实现相同的结果。

示例模块将位于我们需要的位置:

  1. 将点击事件绑定到标签
  2. 设置一些元数据值
  3. 致电第三方跟踪功能
  4. 将元数据重置为原始值

    icisSite.tabPageView = function($){
    
        var $tabs = $('.tbc .tbc-tabs > div'),
            pageName = $('meta[name=gwa_pageName]'),
            sec3 = $('meta[name=gwa_siteSection3]'),
            sec4 = $('meta[name=gwa_siteSection4]'),
            pageNameLen = pageName.length,
            sec3Len = sec3.length,
            sec4Len = sec4.length,
            txt,
            pNameContent,
            pNameConstruct,
            section,
            metaContent,
            metaConstruct;
    
        function init() {   
            bindClickHandlerToTabs();
        };  
    
        function bindClickHandlerToTabs() {
            if (pageNameLen !== 0 && (sec3Len !== 0 || sec4Len !== 0)){
                $tabs.bind('click', updateMetaData(){
                    txt = $(this).find('span').text(),
                    txt = ' | ' + txt;
                    updateMetaData();
                }); 
            } else {
                return false;
            }           
        };  
    
        function updateMetaData(){
            pNameContent = pageName.attr('content'),
            pNameConstruct = pNameContent + txt;
            if (sec3Len !== 0 && sec4Len !== 0){
                section = 'gwa_siteSection4',
                metaContent = sec4.attr('content'),
                metaConstruct = metaContent + txt;
            } else {
                section = 'gwa_siteSection3'
                metaContent = sec3.attr('content'),
                metaConstruct = metaContent + txt;
            }   
            return callGWATrackingFucntions();  
        };
    
        function callGWATrackingFucntions() {
            gwa_SetMetaValue(section, metaConstruct); 
            gwa_trackPageView(pNameConstruct);
            return resetMetaData();
        };
    
        function resetMetaData() { 
            pageName.attr('content', pNameContent);
            $('meta').each(function(index){
                var name = $(this).attr('name');
                if (section === name){
                    $(this).attr('content', metaContent);   
                }
            });     
        };
    
        return {
            init: init  
        };
    
    }(jQuery);
    
    icisSite.tabPageView.init();
    

1 个答案:

答案 0 :(得分:2)

如果要创建仅调用一次的函数,则需要询问它们为什么是函数而不仅仅是顺序代码。也许是为了可扩展性或模块化。额外的函数调用并不是特别重要。

通过更改以下内容中固有的多功能调用,您可以极大地提高效率(尽管可能并不显着):

$(this).attr('content', metaContent); 

直接访问属性:

this.content = metaContent;

除非您打算修改HTML内容属性(这不太可能)而不是DOM属性(我不知道 attr 方法在这种情况下实际会改变哪一个)。

jQuery即将对备受诟病的 attr 方法进行一些重大更改,除非你真的需要(几乎从不),否则不使用它总是一个好主意。