javascript模块化详解
模块化:每个模块只完成一个独立的功能,然后提供该功能的接口。模块间通过接口访问。模块中的(过程和数据)对于其它模块来说是私有的(不能访问修改)
原始人写法:
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,);
CommonJS和AMD
目前,通行的Javascript模块规范共有两种:CommonJS和AMD。
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:加载成功之后的回调函数。
最新文章
- xcode7无证书真机调试 Error: An App ID with identifier ";*"; is not avaliable. Please enter a different string.
- 定时器的fireDate指的是触发时间
- 使用WinDbg调试SQL Server查询
- vi编辑
- c语言学习之基础知识点介绍(七):循环结构
- .NET常用的扩展方法整理
- 阵列卡,组成的磁盘组就像是一个硬盘,pci-e扩展出sata3.0
- Maven之——坐标和依赖(上)
- Flink Program Guide (3) -- Event Time (DataStream API编程指导 -- For Java)
- 一个基于POI的通用excel导入导出工具类的简单实现及使用方法
- Tomcat启动中的一些问题
- jquery中常用的方法和注意点
- 织梦CMS提示DedeTag Engine Create File False错误的解决办法总结
- 刨根问底:if 后怎么就可以跟对象,变量交换写法是语法糖吗?
- Nginx 自定义添加Response Headers 修改server
- Xshell利用lrzsz工具上传下载
- 记录一次Struts s2-045重大安全漏洞修复过程
- 《生命》第二集:Reptiles and Amphibians (爬行和两栖动物)
- git 更新远程分支列表
- iOS - CodeReview 代码评审