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

时间:2013-10-07 11:17:28

标签: javascript revealing-module-pattern

我想最终摆脱我编写JS的非结构化方式,并最近更多关于“Revealing Module Pattern”。至少对我而言似乎非常有用,但我还没有找到一些问题的答案。因此,假设我们的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 个答案:

答案 0 :(得分:1)

感谢Closure,example here

,您将可以访问身体变量

因此,您不需要在函数内声明一些body变量。

对于构造函数问题,您已经有一个,是用于声明对象的函数,请参阅detailed example

的示例