美文网首页JavaScript
模块化的演变

模块化的演变

作者: LiuliuZhang | 来源:发表于2017-05-09 13:16 被阅读0次

    全局函数的方式

    在html中要实现加减的运算

    <body>
      <input type="text" id="txt_a">
      <select id="sel_op">
        <option value="+">+</option>
        <option value="-">-</option>
      </select>
      <input type="text" id="txt_b">
      <input type="button" id="btn" value=" = ">
      <input type="text" id="txt_res">
      <!-- 需要实现计算的功能,于是乎抽象了一个计算的模块 -->
    </body>
    

    在header中实现加减function,将重复使用的代码封装到函数中。

      <script>
        // 实现加减function
        function add(a, b) {
          return parseFloat(a) + parseFloat(b);
        }
        function subtract(a, b) {
          return parseFloat(a) - parseFloat(b);
        }
        // 早期的开发过程中就是将重复使用的代码封装到函数中
        // 再将一系列的函数放到一个文件中,称之为模块
        // 约定的形式定义的模块,存在命名冲突,可维护性也不高的问题
        // 仅仅从代码角度来说:没有任何模块的概念
        window.onload = function() {
          var ta = document.getElementById('txt_a');
          var tb = document.getElementById('txt_b');
          var tres = document.getElementById('txt_res');
          var btn = document.getElementById('btn');
          var op = document.getElementById('sel_op');
          btn.onclick = function() {
            switch (op.value) {
              case '+':
                tres.value = add(ta.value, tb.value);
                break;
              case '-':
                tres.value = subtract(ta.value, tb.value);
                break;
            }
          };
        };
      </script>
    

    封装对象的方式

    首先建立math对象,对于加减操作都放在calculator对象中,在calculator对象中添加具体方法,缺点是没有私有空间。

        var math = {};
        math.calculator = {};
        math.calculator.add = function(a, b) {
          return a + b;
        };
    

    私有空间划分

    建立自执行函数,返回相应的方法,函数有了私有空间可以定义私有变量及方法

    <script>
        // 计算模块
        var calculator = (function() {
          // 这里形成一个单独的私有的空间var name = '';
          // convert函数为私有的转换逻辑
          function convert(input){
            return parseInt(input);
          }
          // 加减函数为暴露给外部的逻辑
          function add(a, b) {
            return convert(a) + convert(b);
          }
          function subtract(a, b) {
            return convert(a) - convert(b);
          }
          // 返回
          return {
            add: add,
            subtract: subtract,
          }
        })();
    

    封装函数的方式

    建立自执行函数,传入参数为window.calculator或空对象,首先实现add方法,新增需求时,传入calculator对象,会添加remain方法

        (function(calculator) {
          function convert(input) {
            return parseInt(input);
          }
          calculator.add = function(a, b) {
            return convert(a) + convert(b);
          }
          window.calculator = calculator;
        })(window.calculator || {});
    
        // 新增需求
        (function(calculator) {
          function convert(input) {
            return parseInt(input);
          }
          // calculator 如果存在的话,就是扩展,不存在就是新加
          calculator.remain = function(a, b) {
            return convert(a) % convert(b);
          }
          window.calculator = calculator;
        })(window.calculator || {});
        // 开闭原则,对新增开放,对修改关闭;
    

    第三方依赖

    对于第三方的依赖,作为参数传入,如下面第一种方式,需要引入jquery,第二中方式jquery直接作为参数传入

        (function(calculator) {
          // 对全局产生依赖,不能这样用
          //console.log($);
          function convert(input) {
            return parseInt(input);
          }
          calculator.add = function(a, b) {
            return convert(a) + convert(b);
          }
    
          window.calculator = calculator;
    
        })(window.calculator || {});
    
        // 新增需求
        // calc_v2016.js
        (function(calculator, $) {
          // 依赖函数的参数,是属于模块内部
          console.log($);
          function convert(input) {
            return parseInt(input);
          }
          // calculator 如果存在的话,我就是扩展,不存在我就是新加
          calculator.remain = function(a, b) {
            return convert(a) % convert(b);
          }
          window.calculator = calculator;
        })(window.calculator || {}, jQuery);
    

    相关文章

      网友评论

        本文标题:模块化的演变

        本文链接:https://www.haomeiwen.com/subject/ebdbtxtx.html