1.原始写法
一个方法或者一个对象就是一个模块.
function m1() {}
var moudle1 = {
_count : 1
//....
}
简单有效.
但坏处也很明显:
污染了全局变量.无法保证和其他模块书写的代码命名不冲突.
对于 moudle1
的患处还有一个,那就是外部可以修改内部的私有变量 _count
2.函数立即执行的写法.
var moudle = (function(){
var _count = 1
var m1 = function() {
_count++
//...
}
return {
m1: m1
}
})()
好处很明显
- 外部无法访问和修改内部
_count
属性. - 可以选择将需要的数据暴露给外部使用.
3.放大模式
如果一个模块很大,必须分成几个部分,或者一个模块需要利用另外一个模块的功能.
这个时候就可以考虑使用放大模式(augmentation)
可以理解成把扩展一个模块的功能.
var moudle1 = (function(module){
var m1 = function() {
// 需要用到moudle.foo方法
module.foo()
}
// 给 moudle.baz 添加 baz 方法.
moudle.baz = function() {
}
return moudle.
})(moudle)
4.宽放大模式
有时候,一些模块都是从网络上加载的.可能出现不存在的情况.所以,为了保证模块的加载不出错误.可以做一些容错处理.
var moudle1 = (function(moudle){
moudle.foo = function() {
}
return moudle
})(moudle1||{})
5.输入全局变量
有时候,一个模块的定义需要依赖其他的模块.
但是模块内部最好不要直接写这些提供了全局对象的模块对象.
这样会造成依赖关系不明确.
var moudle = (funciton(){
var m1 = function() {
// moudle 依赖了 jquery
jquery.fn()
}
var m2 = function() {
// moudle 依赖了 yahoo
yahoo.fn()
}
return {
m1:m1,
m2:m2
}
})()
如果对其他模块有所依赖,建议写成参数传入的形式.
var moudle = (function($,y){
var m1 = function() {
$.fn()
}
var m2 = function() {
y.fn()
}
return {
m1,
m2
}
})(jquery,yahoo)