【问题标题】:Returning multiple calls to methods from another method in JavaScript revealing module pattern从 JavaScript 揭示模块模式中的另一个方法返回对方法的多个调用
【发布时间】:2026-02-09 21:00:01
【问题描述】:

我正在为当前项目试验揭示模块模式。

我在几个方法的顶部有 init 方法,在这些方法中我设置变量和调用方法,以便模块在被相应的事件处理程序调用时正常运行。

我有一个 init 方法,目前看起来像这样:

function init(elem) {
    var width, 
    height,  
    tipHeight, 
    tipWidth, 
    topMargin, 
    leftMargin;

    return appendTip();
};

所以这会返回对 appendTip 方法的调用。

在另一个模块中,设置如下所示:

    function init() {
        var width = 0,
        $siteNavListElem = $('.nav-SiteNav .nav-list > li'),
        $subNav = $('.subNav > li > ul');

            appendSubNav();
        getWidth();
};

所以现在有两个单独的方法调用。这段代码运行良好,但想知道它是否可以更整洁?

如何退回这两个?归还他们是最好的称呼他们的方式吗?

谢谢。

【问题讨论】:

    标签: javascript jquery methods callback module-pattern


    【解决方案1】:

    实际上,我不确定您是否完全遵循揭示模块模式。该模式解释了返回一个包含对象公共接口的公共对象。因此,从函数内部返回一个函数并不真正构成该模式。对于那种模式,你正在考虑做这样的事情

     function revealingPattern = function(){
        var privateVar = 1;
        function prviateFunction(){
        //.....
        }
    
        function publicFunction(){
        //code
        }
    
        function pubFunction2()[
        //code
        }
        var publicVariable = 2;
    
        return{
         pubFunction1:publicFunction
        ,pubFunction2:pubFunction2
        ,pubVariable:publicVariable
        };
        }()
    
    //use as
    revealingPattern.pubFunction1();
    

    基本上,您从封装函数 (revealingPattern) 返回的所有内容都是一个匿名对象,其中包含命名属性,这些属性是您可以使用的revealingPattern 对象的公共接口。

    然而,我对这种模式的不满是它不能告诉您返回对象中的属性是函数还是变量!

    因此,如果您真的想实现该模式,您可能需要稍微重构一下您的代码。否则,您几乎可以采取任何您想要的方法。它们都是有效的,但不是揭示模块模式。

    【讨论】:

    • 如果您向下滚动到“揭示模块模式”部分。
    • 我刚刚浏览了链接。实际上,即使在这种模式中也有描述,关键是返回一个匿名对象,其中包含指向您的公共函数的指针。返回 {set:setPerson,get:getPerson} 的“return”语句就是这样做的。所以基本上你不会将函数调用作为 return myFunction() 返回,而是一个匿名对象,其中包含对函数的“引用”作为 return {myFun:myFunction}。希望这能解释一下
    • 你绝对需要这种模式吗?我的意思是你想从你的脚本中“隐藏”一些方法或属性吗?该模式将使您能够创建一个“对象”,本质上是一个您可以使用的公共接口和一个您不能使用的私有接口。如果这不是您想要的,您可以跳过整个模式并简单地执行您在第二个代码示例中已经在执行的操作。或者发布更多细节和一些代码,我会帮助你:)
    • 我正在玩自定义模式。等我做完我就贴出来给大家看看。不过你必须保证不笑:)