• 现在化的模块机制


         旧机制下的模块化编程采用的一般是独立作用域进行封装,如我们所熟悉的立即执行函数(IIFE)

         (function(){
             ***
         })()

         又或者对象形式封装
         var module = new Object({});
         var module1 = {};

        又或者宽放大模式 (本质上还是属于IIFE)

        var module1 = (function (mod) {
            mod.m1 = function () { console.log();}
            return mod;
        })(window.module1 || {});

      

    现在化的模块机制

    var MyModules = (function Manager() {
                var modules = {};
                function define(name, deps, impl) {
                    for(var i = 0; i < deps.length; i++) {
                        deps[i] = modules[deps[i]];
                    }
                    modules[name] = impl.apply(impl, deps);
                }
                function get(name) {
                    return modules[name];
                }
                return {
                    define: define,
                    get: get
                };
            })();
    
    
            /*********************************
                这段代码的核心是 modules[name] = impl.apply(impl, deps)。为了模块的定义引入了包装
                函数(可以传入任何依赖),并且将返回值,也就是模块的 API,储存在一个根据名字来管
                理的模块列表中。
                下面展示了如何使用它来定义模块:
            *********************************/
                                                                                                                                                 
    
            MyModules.define("bar", [], function () {
                function hello(who) {
                    return "Let me introduce: " + who;
                }
    
                return {
                    hello: hello
                };
            });
    
            MyModules.define("foo", ["bar"], function (bar) {
                var hungry = "hippo";
                function awesome() {
                    console.log(bar.hello(hungry).toUpperCase());
                }
    
                return {
                    awesome: awesome
                };
            });
    
            var bar = MyModules.get("bar");
            var foo = MyModules.get("foo");
    
            console.log(bar.hello("hippo"));    // Let me introduce: hippo
    
            foo.awesome();                      // LET ME INTRODUCE: HIPPO
    
            /********************
                "foo" 和 "bar" 模块都是通过一个返回公共 API 的函数来定义的。"foo" 甚至接受 "bar" 的
                示例作为依赖参数,并能相应地使用它。
                为我们自己着想,应该多花一点时间来研究这些示例代码并完全理解闭包的作用吧。最重
                要的是要理解模块管理器没有任何特殊的“魔力”。它们符合前面列出的模块模式的两个
                特点:为函数定义引入包装函数,并保证它的返回值和模块的 API 保持一致。
                换句话说,模块就是模块,即使在它们外层加上一个友好的包装工具也不会发生任何变化
            ********************/
  • 相关阅读:
    在eclipse中进行HotSpot的源码调试
    CentOS6.5上编译OpenJDK7源码
    商城楼层跳转
    javascript原生百叶窗
    javascript原生轮播
    Canvas计时器
    纯js模拟 radio和checkbox控件
    纯js日历
    关于匿名函数,闭包和作用域链
    端口占用问题
  • 原文地址:https://www.cnblogs.com/lmyt/p/7097562.html
Copyright © 2020-2023  润新知