模块化:每个模块只完成一个独立的功能,然后提供该功能的接口。模块间通过接口访问。模块中的(过程和数据)对于其它模块来说是私有的(不能访问修改)

原始人写法:

 function m1(){
  //...
}
function m2(){
  //...
}

对象封装写法

 var loveThing = {
mylove : "coding",
getLove :function() {
returnthis.mylove;
},
sayLove : function(thing) {
console.log(thing);
}
}
 console.log(loveThing.getLove());//>>> coding
loveThing.sayLove('girl');//>>> girl

这种写法已经有点模块的样子了,一下就能看出这几个函数和变量之间的联系。

缺点在于所有变量都必须声明为公有,所以都要加this指示作用域以引用这些变量。更危险的是,在对象之外也能轻松更改里面的参数:

 loveThing.mylove = "sleeping";
console.log(loveThing.getLove());//>>> sleeping

立即执行函数

外部可以访问my这个接口,但以下代码(过程和数据)对于其它模块来说是私有的

以下这种方法返回一个对象,让其他模块去调用

 var loveThing = (function(){
var my = {};
var love = "coding";
my.getLove = function() {
return love;
}
my.sayLove = function(thing) {
console.log(thing);
}
return my;
})();
console.log(loveThing.getLove());//>>> coding loveThing.sayLove('reading');//>>> reading

将局部的函数提升到 windows 下面,可以让其他地方使用。

 (function(){
// private code
var a = function(){ }
window.a = a;
})();

我们试着获取里面的变量:

 console.log(loveThing.love);//>>> undefined

果然,外部根本看不见里面的零件只能使用提供的接口。这样才能保证私有变量的安全。

输入全局变量

独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互。为了在模块内部调用全局变量,必须显式地将其他变量输入模块。

下面除了保证模块的独立性,还使得模块之间的依赖关系变得明显。

 var module1 = (function ($,) {
    //...
})(jQuery,);

CommonJSAMD

目前,通行的Javascript模块规范共有两种:CommonJSAMD

最近在学习node,node.js的模块系统,就是参照CommonJS规范实现的。只使用require(),用得一个爽字
例如:
 var math = require('math'); 

然后,就可以调用模块提供的方法:

 var math = require('math');
math.add(2,3); // 5

然而,由于一个重大的局限,使得CommonJS规范不适用于浏览器环境。还是上一节的代码,如果在浏览器中运行,会有一个很大的问题,你能看出来吗?

第二行math.add(2, 3),在第一行require('math')之后运行,因此必须等math.js加载完成。也就是说,如果加载时间很长,整个应用就会停在那里等。

因此,浏览器端的模块,不能采用"同步加载"(synchronous),只能采用"异步加载"(asynchronous)。这就是AMD规范诞生的背景。

AMD是"Asynchronous Module Definition"的缩写,意思就是"异步模块定义"。require.js实现了AMD规范

AMD也采用require()语句加载模块,但是不同于CommonJS,它要求两个参数

require([module], callback); 

  • [module]:数组,要加载的模块;
  • callback:加载成功之后的回调函数。

javascript模块化详解的更多相关文章

  1. JavaScript事件详解-jQuery的事件实现(三)

    正文 本文所涉及到的jQuery版本是3.1.1,可以在压缩包中找到event模块.该篇算是阅读笔记,jQuery代码太长.... Dean Edward的addEvent.js 相对于zepto的e ...

  2. JavaScript事件详解-Zepto的事件实现(二)【新增fastclick阅读笔记】

    正文 作者打字速度实在不咋地,源码部分就用图片代替了,都是截图,本文讲解的Zepto版本是1.2.0,在该版本中的event模块与1.1.6基本一致.此文的fastclick理解上在看过博客园各个大神 ...

  3. JavaScript正则表达式详解(一)正则表达式入门

    JavaScript正则表达式是很多JavaScript开发人员比较头疼的事情,也很多人不愿意学习,只是必要的时候上网查一下就可以啦~本文中详细的把JavaScript正则表达式的用法进行了列表,希望 ...

  4. JavaScript正则表达式详解(二)JavaScript中正则表达式函数详解

    二.JavaScript中正则表达式函数详解(exec, test, match, replace, search, split) 1.使用正则表达式的方法去匹配查找字符串 1.1. exec方法详解 ...

  5. JavaScript事件详解-zepto的事件实现

    zepto的event 可以结合上一篇JavaScript事件详解-原生事件基础(一)综合考虑源码暂且不表,github里还有中文网站都能下到最新版的zepto.整个event模块不长,274行,我们 ...

  6. javascript 函数详解2 -- arguments

    今天我们接着上篇文章来继续javascript函数这个主题.今天要讲的是函数对像中一个很重要的属性--arguments. 相关阅读: javascript 函数详解1 -- 概述 javascrip ...

  7. [原创]JavaScript继承详解

    原文链接:http://www.cnblogs.com/sanshi/archive/2009/07/08/1519036.html 面向对象与基于对象 几乎每个开发人员都有面向对象语言(比如C++. ...

  8. javaScript基础详解(1)

    javaScript基础详解 首先讲javaScript的摆放位置:<script> 与 </script> 可以放在head和body之间,也可以body中或者head中 J ...

  9. javascript设计模式详解之命令模式

    每种设计模式的出现都是为了弥补语言在某方面的不足,解决特定环境下的问题.思想是相通的.只不过不同的设计语言有其特定的实现.对javascript这种动态语言来说,弱类型的特性,与生俱来的多态性,导致某 ...

随机推荐

  1. rails开发demo(一)搭建环境

    环境 ubuntu 14.04 为了安装rails4.2 和 ruby 2.2.2,这是目前稳定的最新版本,需要先安装rvm sudo apt-get update sudo apt-get inst ...

  2. java打字游戏

    小记:老早之前写的程序,今天发现之前在 csdn上写的东西的图片不显示了,搞得人好郁闷,所以把之前零星的几篇文章搬个家 游戏运行截图: 字母实体类 package com.git.game; impo ...

  3. web开发相关解决方案

    HTML5 API 应用 History.js - gracefully supports the HTML5 History/State APIs pushState + ajax Notify.j ...

  4. hdu 4607 Park Visit 求树的直径

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4607 题目大意:给你n个点,n-1条边,将图连成一棵生成树,问你从任意点为起点,走k(k<=n) ...

  5. centos 下使用locate命令

    首先安装mlocate yum -y install mlocate 更新数据库:updatedb 查找:locate nginx

  6. Scribefire离线编写博客的方法

    用Firefox下载Scribefire next插件www.scribefire.com cnblogs添加方法: URL:http://www.cnblogs.com/[你的博客名] API为ht ...

  7. 一个fork的面试题

    前两天有人问了个关于Unix的fork()系统调用的面试题,这个题正好是我大约十年前找工作时某公司问我的一个题,我觉得比较有趣,写篇文章与大家分享一下.这个题是这样的: 题目:请问下面的程序一共输出多 ...

  8. JAVA RMI helloworld入门

    Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...

  9. 【C#】1.算法温故而知新 - 简单的桶排序

    该算法的时间复杂度是O(M+N),M为桶的个数,N为待排序的个数 缺点: 1.不适用于小数 2.当数值过多,太浪费空间,比如数值范围为0~99999,那需申请100000个变量,也就是要写成a[100 ...

  10. 深度优先搜索 codevs 1031 质数环

    codevs 1031 质数环  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description 一个大小为N(N<=17)的质数环是 ...