return {
// 这是一个布尔值
bool: true,
// 一个字符串
string: "a string",
// 一个数组
array: [ 1, 2, 3, 4 ],
// 一个对象
object: {
lang: "en-Us"
},
getData: function() {
// 得到 `data` 的值
return data;
},
setData: function( value ) {
// 返回赋值过的 `data` 的值
return ( data = value );
}
};
})();
// 其他一些将会出现在这里
// 把你的模块变成全局对象
global.Module = Module;
})( this );
// 5.2.1
// 一个实用的构建函数
(function( global ) {
function Ctor( foo ) {
this.foo = foo;
return this;
}
Ctor.prototype.getFoo = function() {
return this.foo;
};
Ctor.prototype.setFoo = function( val ) {
return ( this.foo = val );
};
// 不使用 `new` 来调用构建函数,你可能会这样做:
var ctor = function( foo ) {
return new Ctor( foo );
};
// 把我们的构建函数变成全局对象
global.ctor = ctor;
})( this );
六、命名
A. 你并不是一个人肉 编译器/压缩器,所以尝试去变身为其一。
下面的代码是一个极糟命名的典范:
复制代码 代码如下:
// 6.A.1.1
// 糟糕命名的示例代码
function q(s) {
return document.querySelectorAll(s);
}
var i,a=[],els=q("#foo");
for(i=0;i<els.length;i++){a.push(els[i]);}
毫无疑问,你写过这样的代码 —— 希望从今天它不再出现。
这里有一份相同逻辑的代码,但拥有更健壮、贴切的命名(和一个可读的结构):
复制代码 代码如下:
// 6.A.2.1
// 改善过命名的示例代码
function query( selector ) {
return document.querySelectorAll( selector );
}
var idx = 0,
elements = [],
matches = query("#foo"),
length = matches.length;
for ( ; idx < length; idx++ ) {
elements.push( matches[ idx ] );
}
一些额外的命名提示:
复制代码 代码如下:
// 6.A.3.1
// 命名字符串
`dog` 是一个 string
// 6.A.3.2
// 命名 arrays
`['dogs']` 是一个包含 `dog 字符串的 array
// 6.A.3.3
// 命名函数、对象、实例,等
camlCase; function 和 var 声明
// 6.A.3.4
// 命名构建器、原型,等
PascalCase; 构建函数
// 6.A.3.5
// 命名正则表达式
rDesc = //;
// 6.A.3.6
// 来自 Google Closure Library Style Guide
functionNamesLikeThis;
variableNamesLikeThis;
ConstructorNamesLikeThis;
EnumNamesLikeThis;
methodNamesLikeThis;
SYMBOLIC_CONSTANTS_LIKE_THIS;
B. 面对 this