README
为按照模块模式提供必要的封装,ES6 之前的模块有时候会使用函数作用域和立即调用函数表达式 (IIFE,Immediately Invoked Function Expression)将模块定义封装在匿名闭包中。模块定义是立即执行 的,如下:
(function () {
// 私有 Foo 模块的代码
console.log("bar");
})();
// bar
如果把这个模块的返回值赋给一个变量,那么实际上就为模块创建了命名空间:
var Foo = (function () {
console.log("bar");
})();
("bar");
为了暴露公共 API,模块 IIFE 会返回一个对象,其属性就是模块命名空间中的公共成员:
var Foo = (function () {
return {
bar: "baz",
baz: function () {
console.log(this.bar);
},
};
})();
console.log(Foo.bar); // 'baz'
Foo.baz(); // 'baz'
类似地,还有一种模式叫作“泄露模块模式”(revealing module pattern)。这种模式只返回一个对象, 其属性是私有数据和成员的引用:
var Foo = (function () {
var bar = "baz";
var baz = function () {
console.log(bar);
};
return {
bar: bar,
baz: baz,
};
})();
console.log(Foo.bar); // 'baz'
Foo.baz(); // 'baz'
在模块内部也可以定义模块,这样可以实现命名空间嵌套:
var Foo = (function () {
return {
bar: "baz",
};
})();
Foo.baz = (function () {
return {
qux: function () {
console.log("baz");
},
};
})();
console.log(Foo.bar); // 'baz'
Foo.baz.qux(); // 'baz'