很少,特别是对于大型项目,我们会将所有代码放在一个文件中,起初很容易将您的代码放在不同的文件中并按特定顺序将它们组合在一起,但这很快就会变得难以管理,使用称为的未知模式“失去增强”我们实际上可以利用 javascript 异步运行时环境。
  
  为了实现这个模式,我们需要一小段逻辑。我们会说如果 awesomeNewModule 存在,然后导入它,否则 awesomeNewModule 只是新对象:
    var awesomeNewModule = (function(){
        var exports={
            foo:5,
            bar:10
        };
        exports.helloMars = function(){
            console.log("Hello Mars!");
        };
        exports.goodbye = function(){
            console.log("Goodbye!");
        }
        return exports;
    }(awesomeNewModule || {}));
  因为我们使用了exports关键字,所以我们会说awesomeNewModule是一个函数中的exports,现在exports {foo:5, bar:10}的所有这些值将被分配给空对象{},如果这是第一个文件,或者如果在创建模块后加载此文件,则将被分配并扩展 awesomeNewModule。
var awesomeNewModule = (function(exports){
    var exports={
        foo:5,
        bar:10
    };
    exports.helloMars = function(){
        console.log("Hello Mars!");
    };
    exports.goodbye = function(){
        console.log("Goodbye!");
    }
    return exports;
}(awesomeNewModule || {}));
  要记住的重要一件事是,如果 awesomeNewModule 已经存在,那么您应该确保这些键 {foo:5, bar:10} 都不存在于 awesomeNewModule 中,并且这些方法都不存在:exports.helloMars ,exports.goodbye 如果是这样,最后加载的任何文件都将覆盖以前文件中名称相同的任何方法或值。
  
  出于这个原因,你不能在模块之间共享值,如果一个模块的任何方面依赖于另一个模块,那么你不能保证我们依赖这些值,但归根结底,编写模块或代码的重点是您将应用程序拆分为彼此不依赖的部分,这样如果一个模块向应用程序引入了中断错误,则不会影响代码的匆忙。此外,还有一些方法可以保护卡片,以确保一个模块不会覆盖从另一个模块创建的模式或方法。
来源:关于 javascript 中模块模式基础知识的树屋研讨会