模块化的演变

全局函数的方式

在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);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 函数和对象 1、函数 1.1 函数概述 函数对于任何一门语言来说都是核心的概念。通过函数可以封装任意多条语句,而且...
    道无虚阅读 4,702评论 0 5
  • 在线阅读 http://interview.poetries.top[http://interview.poetr...
    前端进阶之旅阅读 115,051评论 24 450
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,422评论 0 2
  • 1.JQuery 基础 改变web开发人员创造搞交互性界面的方式。设计者无需花费时间纠缠JS复杂的高级特性。 1....
    LaBaby_阅读 1,222评论 0 1
  • 致敬,2016年的自己。 3月1号离家,从北到南,拜访好友,随心定于上海,开始了一个人的工作和生活。 一路向南! ...
    Diki范范阅读 542评论 0 0