揭示模块模式 - 全局变量/初始化函数

3

我希望最终摆脱我的JS编写无结构的方式,并最近阅读了大量有关“揭示模块模式”的内容。对我来说,这似乎非常有用,但我仍然没有找到一些问题的答案。假设我们在JS中有一些不同的模块,例如“site”和“nav”。 “nav”模块中有一些私有函数,并且可能稍后还有一些公共函数。那么,在这些模块中调用init函数的最佳方法是什么?我想创建一个公共函数,并使用MODULE.init();进行调用。但是我认为这似乎是不好的实践,并且我之前也没有见过这种情况。

$(function () {
    var site = (function () {
        var 
            module = {},
            privateVar = 3; // private variable

        function privateFunction() { // private function
            // some code here
        }

        module.init = function () {
           // global init function
        };        

        return module;
    }());

    var nav = (function () {
        var 
            module = {},
            navOpen = false; // private variable

        function open() { // private function
            // some code here
        }
        function close() { // private function
            // some code here
        }

        module.init = function () {                    
            // event handlers for open and close functions etc.
        };        

        return module;
    }());

    nav.init();
    site.init();

});

还有一个问题,我在阅读的任何文章中都没有找到答案,那就是如何定义一个全局变量(比如body),我可能需要在我的任何模块中使用它(添加一些类或其他操作)。假设我需要在“nav”和“site”模块中都访问我的body(就像jQuery中的$("body")),那么这样做更好吗:

$(function () {
    var site = (function () {
        var 
            module = {},
            body = $("body"); // creating the "body" variable in every module

        // .. module code
        return module;
    }());

    var nav = (function () {
        var 
            module = {},
            body = $("body"); // and again in this module

        // module code       
        return module;
    }());

});

或者将它放在你的JS文件的顶部。
$(function () {
    var
        body = $("body");

    var site = (function () {
        // module code
    }());

    var nav = (function () {
        // module code
    }());

或者有更好的方法来做这件事/ 总体上改进我的代码有什么建议?感谢您提前帮助。

1
不要在 var 后面单独换行。看起来很丑,而且自动分号插入可能会导致错误。 - lukas.pukenis
@lukas.pukenis 谢谢,我会的。那init函数或全局“body”变量怎么办?有什么建议吗? - mrksbnch
@demrks 由于闭包,您将获得对body变量的访问权限。 - Claudio Santos
@ClaudioSantos 谢谢,但你能给我一个快速的例子吗?我对这些东西都很新,不太确定如何获得“访问”。 - mrksbnch
1个回答

1
你将通过Closure获得body变量的访问权限,示例在这里
因此,您不需要在函数内部声明一些body变量。
对于构造函数问题,您已经拥有一个,就是用于声明对象的函数,参见详细示例

啊,好的,谢谢。对我来说,你的例子看起来很像我的第三个代码片段,所以我认为那是最好的方法。你有关于我提出的“init”函数的其他问题有什么建议吗?目前我将“init”函数声明为公共的,然后像“MODULE.init()”这样调用它(请参见我的答案中的第一个代码片段)。但对我来说,这似乎是错误的或不好的做法。有什么建议吗? - mrksbnch
1
最后一个例子是使用我的建议和构造函数,详见更新。 - Claudio Santos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接