大多数模块依赖加载器/管理器本质上都是将模块定义封装进一个友好的API。
var MyModules = (function(){
var modules = {};
function define(name, deps, impl) {
for(var i = 0; i < deps.length; i++) {
deps[i] = modules[deps[i]];
}
modules[name] = impl.apply(impl, deps);
}
function get(name) {
return modules[name];
}
return {
define : define,
get : get
};
})();
这段的代码的核心是
modeules[name] = imp.apply(impl, deps);
,为了模块的定义引入包装函数(可以传入任何依赖),并且将返回值,也就是模块的API,储存在一个根据名字来管理的模块列表中。
MyModules.define('bar', [], function() {
function hellow(who) {
return 'Let me introduce : ' + who;
}
return {
hellow : hellow
};
});
MyModules.define('foo', ['bar'], function() {
var hungry = 'hippo';
function awesome() {
console.log(bar.hellow(hungry).toUpperCase());
}
return {
awesome : awesome
};
});
var bar = MyModules.get('bar');
var foo = MyModules.get('foo');
console.log(bar.hellow('hippo')); //Let me introduce : hippo
foo.awesome(); //LET ME INTRODUCE : HIPPO
当函数可以记住并访问所在的词法作用域,即使函数是在当前词法作用域之外执行,这是就产生了闭包。
摘自:2017年3月11日 《你不知道的javascript 上卷 - 5.5.1 现代的模块机制》