http://www.ruanyifeng.com/blog/2012/10/javascript_module.html

一、原始写法

模块就是实现特定功能的一组方法。

不同函数简单放在一起就算一个模块

如:

function func1(){
//执行代码
}
function func2(){
//执行代码
}

上面函数func1和func2组成了一个模块,使用的时候直接调用即可;

缺点:污染全局变量,无法保证不与其他模块变量名发生冲突,而且模块之间看不出直接关系

二、对象写法

为了解决上面的缺点,可以把模块写成一个对象,所有模块成员放在对象里面。

如:

var module=new Object({
_count:0,
func1:function(){
//执行代码
},
func2:function(){
//执行代码
}
});

上面,func1和func2函数封装在module对象里,使用的时候就是调用这个对象的属性,如:module.func1();

缺点:这样的写法暴露了所有模块成员,内部状态可以被外部改写。比如,外部代码可以直接改变内部_count值,如:module._count=3;

三、立即执行函数写法

使用立即执行函数可以达到不暴露私有成员的目的

如:

var module=(function(){
var _count=0;
var _testVar=1;
var func1=function(){
console.log('func1_'+this._count);
};
var func2=function(){
console.log('func2_'+_count);
};
return {
func1:func1,
func2:func2,
_count
};
})();
module._count=2;
module.func1();
module.func2();

使用上面写法,外部代码无法调用到_testVar变量,console.log(module._testVar);//undefined

注意上面写法,外部可以调用func1和func2及_count,是函数以对象形式返回了变量;

改变了内部变量_count值,如果内部函数func1不使用this,则不能输出后面改变了_count的值

上面就是JavaScript模块的基本写法

四、放大模式

如果一个模块很大,必须分成几个部分,或者一个模块需要继承另一个模块,这时就有必要采用“放大模式”(augmentation)

如:

var module=(function(mod){
mod.func3=function(){
console.log('func3_'+this._count);
}
return mod;
})(module);
module.func3();

五、宽放大模式

浏览器中,模块的各个部分通常都是从网上获取的,有时无法知道哪个部分会先加载,如果采用上面的写法,没有先加载之前的模块,而是直接先加载了上面四中的模块,就会报空对象的错,这时就要采用“宽放大模式”。

如:

var module=(function(mod){
mod.func3=function(){
console.log('func3_'+this._count);
}
return mod;
})(window.module||{});
module.func3();

与“放大模式”相比,“宽放大模式”就是“立即执行函数”的参数可以是空对象。

六、输入全局变量

独立性是模块的重要特点,模块内部最好不与程序的其他部分直接交互

为了在模块内调用全局变量,必须显示的将其他变量输入模块

如:调用JQuery

var moduleJQuery=(function($){
var func=function(){
$('#txt').val('Text');
};
return {
func:func
};
})(jQuery);
moduleJQuery.func();

JavaScript模块化学习基础的更多相关文章

  1. javascript 模块化学习:Class打包出来无法实例化问题

    菜鸟初学前端,第一次尝试使用webpack, 目的是做一个lib,想用webpack + babel 自动化打包出来 es5 的js代码 模块中用到了Class,直接export{className} ...

  2. 该如何理解AMD ,CMD,CommonJS规范--javascript模块化加载学习总结

    是一篇关于javascript模块化AMD,CMD,CommonJS的学习总结,作为记录也给同样对三种方式有疑问的童鞋们,有不对或者偏差之处,望各位大神指出,不胜感激. 本篇默认读者大概知道requi ...

  3. JavaScript学习基础部分

    JavaScript学习基础 一.简介 1.JavaScript 是因特网上最流行的脚本语言,并且可在所有主要的浏览器中运行,比方说 Internet Explorer. Mozilla.Firefo ...

  4. JavaScript模块化编程之AMD - requireJS基础使用

    JavaScript模块化编程之AMD requireJS基础使用 标签(空格分隔): JavaScript 参考文章 AMD规范 AMD是"Asynchronous Module Defi ...

  5. Javascript模块化编程(一):模块的写法 (转载 学习中。。。。)

    转载地址:http://www.ruanyifeng.com/blog/2012/10/javascript_module.html 阮一峰 大神:http://www.ruanyifeng.com/ ...

  6. js 模块化的一些理解和es6模块化学习

    模块化 1 IIFE 2 commonjs 3 浏览器中js的模块化 4 简单理解模块加载器的原理  5 es6 之前在参加百度前端技术学院做的小题目的时候,自己写模块的时候 都是写成立即调用表达式( ...

  7. 实现一个JavaScript模块化加载器

    对任何程序,都存在一个规模的问题,起初我们使用函数来组织不同的模块,但是随着应用规模的不断变大,简单的重构函数并不能顺利的解决问题.尤其对JavaScript程序而言,模块化有助于解决我们在前端开发中 ...

  8. Javascript模块化编程之难处

    接着上一篇“Javascript模块化编程之Why”说起,Javascript担子重了之后程序也就复杂了.在大把语言都模块化编程的形势下,Javascript也不可能袖手旁观啊,毕竟这是一条经过实践检 ...

  9. JavaScript模块化思想之入门篇

    在写正文之前先写一点废话,从我大三下学期正式接触前端到现在,已经六个月了.自己从HTML,CSS,简单的JS验证开始,一点点开始走入前端的世界.越发的感觉前端这一领域散发着无穷的魅力,也许这和我真心喜 ...

随机推荐

  1. 【转】【WPF】wpf 图片指针处理

    我一直用GDI+做Winform 的基于指针的图片处理,这次下决心全部移到wpf上(主要是显示布局很方便)采用的图片是2512*3307 的大图 830万像素类库基于WritableBitmapEx ...

  2. Download the WDK, WinDbg, and associated tools

    Download the WDK, WinDbg, and associated tools This is where you get your Windows Driver Kit (WDK) a ...

  3. The ServiceClass object does not implement the required method in the following form: OMElement sayHello(OMElement e)

    今天遇到一件诡异的事情,打好的同一个aar包,丢到测试环境tomcat,使用soapui测试,正常反馈结果. 丢到本地tomcat,使用soapui测试,始终报以下错误. <soapenv:En ...

  4. php基础23:数值与数值函数

    <?php //1.自动转换 $a = 5; $b = "5a"; $c = $a + $b; echo $c; echo "<br>"; $ ...

  5. PHP基础18:require和include

    <?phph //1.通过 include 或 require 语句,可以将 PHP 文件的内容插入另一个 PHP 文件(在服务器执行它之前) //include 和 require 语句是相同 ...

  6. MATLAB中提高fwrite和fprintf函数的I/O性能

    提高fwrite和fprintf函数的I/O性能 http://www.matlabsky.com/thread-34861-1-1.html     今天我们将讨论下著名的fwrite(fprint ...

  7. HDU3923-Invoker-polya n次二面体

    polya定理.等价类的个数等于∑颜色数^置换的轮换个数 不可翻转的串当中.直接计算∑m^(gcd(n,i)) ,这里gcd(n,i)就是第i个置换的轮换数. 翻转的情况再分n奇偶讨论. n次二面体都 ...

  8. 嵌入式Linux驱动开发之helloword心得

    自从选择了物联网这个专业,智能XX的字样牵动着每一个学习这个专业的孩子. 大家兴致勃勃的来到了学校,结果一切想象和自己的设想并不一样.想象中的各种智能般梦幻的场景变成了真实的高数/电路/模电等等诸如此 ...

  9. 教你用netstat-实践案例

    netstat命令的功能是显示网络连接.路由表和网络接口信息,可以让用户得知目前都有哪些网络连接正在运作. 该命令的一般格式为: netstat [选项] 命令中各选项的含义如下: -a 显示所有so ...

  10. Matrix67大牛推荐的省选知识点

    时间复杂度(渐近时间复杂度的严格定义,NP问题,时间复杂度的分析方法,主定理)排序算法(平方排序算法的应用,Shell排序,快速排序,归并排序,时间复杂度下界,三种线性时间排序,外部排序)数论(整除, ...