您的位置:首页 > 其它

闭包的总结(干货2)--模块机制

2016-12-10 12:05 162 查看
现代模块机制:



varMyModules=(functionManager(){
varmodules={};
functiondefine(name,deps,impl){
for(vari=0;i<deps.length;i++){
deps[i]=modules[deps[i]];
}
modules[name]=impl.apply(impl,deps);
}
functionget(name){
returnmodules[name];
}
return{
define:define,
get:get
};
})();





首先是匿名函数立即运行,返回一个对象,对象包含2个方法,一个定义模块,一个get获取模块

定义模块:name:定义的模块名,字符串deps:依赖的列表impl模块的实现



apply将deps导入到impl并返回模块对象存入modules[name]


实际例子:


MyModules.define("bar",[],function(){
functionhello(who){
return"Letmeintroduce:"+who;
}
return{
hello:hello
};
});
MyModules.define("foo",["bar"],function(bar){
varhungry="hippo";
functionawesome(){
console.log(bar.hello(hungry).toUpperCase());
}
return{
awesome:awesome
};
});
varbar=MyModules.get("bar");
varfoo=MyModules.get("foo");
console.log(
bar.hello("hippo")
);//Letmeintroduce:hippo
foo.awesome();//LETMEINTRODUCE:HIPPO




未来模块机制


通过模块系统进行加载时,ES6会将文件当作独立的模块来处理。每个模块都可以导入其他模块或特定的API成员,同样也可以导出自己的API成员。

基于函数的API:并不是一个能被稳定识别的模式(编译器无法识别),它们的API语义只有在运行时才会被考虑进来。因此可以在运行时修改一个模块
的API

ES6模块API:更加稳定,编译期就会检查模块是否存在,ES6没有行内格式,一个文件一个模块,引擎有默认的模块加载器,可以导入模块的时候

异步的加载模块文件

bar.js
functionhello(who){
return"Letmeintroduce:"+who;
}
exporthello;
foo.js
//仅从"bar"模块导入hello()
importhellofrom"bar";
varhungry="hippo";
functionawesome(){
console.log(
hello(hungry).toUpperCase()
);
}
exportawesome;
baz.js
modulefoofrom"foo";
modulebarfrom"bar";
console.log(
bar.hello("rhino")
);//Letmeintroduce:rhino
foo.awesome();//LETMEINTRODUCE:HIPPO


module整个导入到当前作用域

import是导入一个或多个API

模块文件中的内容会被当作好像包含在作用域闭包中一样来处理,就和前面介绍的函数闭包模块一样。

模块有两个主要特征:(1)为创建内部作用域而调用了一个包装函数;(2)包装函数的返回值必须至少包括一个对内部函数的引用,这样就会创建涵盖整个包装函数内部作用域的闭包

《你不知道的javascript》

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐
章节导航