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

标签 javascript revealing-module-pattern

我想最终摆脱我编写 JS 的非结构化方式,并且最近对“揭示模块模式”大加关注。至少对我来说它似乎很有用,但我还没有找到我的一些问题的答案。假设我们的 JS 中有一些不同的模块,在本例中为“site”和“nav”。 “nav”模块中有一些私有(private)函数,稍后可能还有一些公共(public)函数。在这些模块中调用 init 函数的最佳方式是什么。我想为它们创建一个公共(public)函数,然后用 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
    }());

或者是否有更好的方法来改进我的代码?预先感谢您的帮助。

最佳答案

由于闭包,您将可以访问主体变量,example here .

因此,您不需要在函数中声明一些主体变量。

对于构造函数问题,您已经有一个,是用于声明对象的函数,请参见此示例以获取 detailed example

关于javascript - 揭示模块模式 - 全局变量/初始化函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19223443/

相关文章:

javascript - javascript 事件监听器用汇编语言编译成什么

javascript - 如何在输入复选框中显示 php 变量

Javascript promise 不会延迟函数执行

javascript - 到达显示模式应用类之外的 btn 事件

javascript - 在揭示模块模式中从模块函数显式访问模块 var

javascript - 获取所选项目的类属性

javascript - 使用 css 中的变换或其他一些高效的方式从圆创建长圆形

javascript - 当没有新的 Prop 出现时,为什么我的 header 组件会重新渲染......?

javascript - 用构造函数揭示模块模式

module-pattern - 创建模块的多个实例