& # 65279;初学angularjs时,对数组传参方式感到很好奇([a, b,函数(a, b){}]),它到底怎么实现的呢?后来由于工作很忙,对这个问题也就慢慢忘记了。
今天闲来无事,有想到了这个问题。最简单的方法就是查看他的源代码。无奈本人E文不好,不说看他的设计逻辑,仅看英文注释就够我头疼了。尝试闭门造车,最终竟然把车造出来了。
既然自己造的车,就要带上自己的名(取姓名拼音第一个字母),就叫他mqyJs把,下面是演示的调用方法:
var app2=mqyJs。applicationCreate([{名称:“直接传入范围”},你好美元,美元的世界,函数(范围,你好,美元全球美元){ 返回$ scope.name +“:”+ hello.name + world.name美元; })); >之前核心部分如下:
//框架开设 var mqyJs={//服务注册 servicesList: {}, servicesRegister:函数(名称,值){ 这一点。servicesList[名字]=价值; },//应用创建 applicationList: [], _args applicationCreate:函数(_opts) { 如果(! _args) { _args=_opts; _opts={} } _opts。=_opts范围。范围| | { 名称:“没范围有设置的 }; 如果(!(_args instanceof数组)){ _args=[美元范围,_args]; } 如果(typeof _args [_args。长度- 1]!=昂?{ 把新的错误(“参数中没有指定运行函数”); } _args。地图((参数、索引)=比;{ 如果(typeof arg=='字符串'){ 如果(arg===美元范围){ _args(指数)=_opts.scope; 其他}{ 如果(! !参数,,在this.servicesList ! (arg)) { 把新的错误(“插件:“+参数+”还没有注册”); } _args(指数)=this.servicesList (arg); } } }); 返回this.applicationList [this.applicationList.push ({ 运行:函数(回调){ 如果(typeof调!=昂?{ 回调函数=(_opts){返回_opts;} } 回调(_args [_args返回。长度- 1)。应用(null, _args)); } })- 1]; } };//框架结束 >之前通过servicesRegister,可以注册服务,比如angularjs的http美元;
//插件开始 mqyJs。servicesRegister($你好,{ 名称:“你好” }); mqyJs。servicesRegister(“世界”美元,{ 名称:“世界” }); mqyJs。servicesRegister(“中国美元”,{ 名称:“中国” });//插件结束最终,对所有注册的应用,自动执行
/* * *初始化完成后系统自动运行 *比如网页中放到window */mqyJs.applicationList。地图(函数(应用程序、索引){ 控制台。日志(“自动调用→应用# +指数+”→' + app.run ()); });尝试跑一下代码,能自动识别参数类型,完美执行。
不传入美元范围时,程序会自动创建一个美元范围。
//演示代码开始 应用var=mqyJs。美元applicationCreate(['美元范围”、“你好”、“中国美元”,函数(范围,你好,美元中国美元){ 返回$ scope.name +“:”+ hello.name + china.name美元; })); var app2=mqyJs。applicationCreate([{名称:“直接传入范围”},你好美元,美元的世界,函数(范围,你好,美元全球美元){ 返回$ scope.name +“:”+ hello.name + world.name美元; })); var app3=mqyJs。applicationCreate([{名称:“世界上也直接传入”},美元你好,{名称:“地球”},函数(范围,你好,美元全球美元){ 返回$ scope.name +“:”+ hello.name + world.name美元; })); ($ var app4=mqyJs.applicationCreate(功能范围){ 返回scope.name美元; }); var选择={ 范围:{ 名称:“自定义范围” } }; var app5=mqyJs。applicationCreate(选择、功能范围($){ 返回scope.name美元; }); app4.run(函数(结果){ 控制台。日志(“手动调用→结果→' +结果); });//演示代码结束 >之前为了方便测试,再把代码重新写一遍,直接复制下面的代码到浏览器控制台即可测试
//框架开设 var mqyJs={//服务注册 servicesList: {}, servicesRegister:函数(名称,值){ 这一点。servicesList[名字]=价值; },//应用创建 applicationList: [], _args applicationCreate:函数(_opts) { 如果(! _args) { _args=_opts; _opts={} } _opts。=_opts范围。范围| | { 名称:“没范围有设置的 }; 如果(!(_args instanceof数组)){ _args=[美元范围,_args]; } 如果(typeof _args [_args。长度- 1]!=昂?{ 把新的错误(“参数中没有指定运行函数”); } _args。地图((参数、索引)=比;{ 如果(typeof arg=='字符串'){ 如果(arg===美元范围){ _args(指数)=_opts.scope; 其他}{ 如果(! !参数,,在this.servicesList ! (arg)) { 把新的错误(“插件:“+参数+”还没有注册”); } _args(指数)=this.servicesList (arg); } } }); 返回this.applicationList [this.applicationList.push ({ 运行:函数(回调){ 如果(typeof调!=昂?{ 回调函数=(_opts){返回_opts;} } 回调(_args [_args返回。长度- 1)。应用(null, _args)); } })- 1]; } };//框架结束//插件开始 mqyJs。servicesRegister($你好,{ 名称:“你好” }); mqyJs。servicesRegister(“世界”美元,{ 名称:“世界” }); mqyJs。servicesRegister(“中国美元”,{ 名称:“中国” }); 应用var=mqyJs。美元applicationCreate(['美元范围”、“你好”、“中国美元”,函数(范围,你好,美元中国美元){ 返回$ scope.name +“:”+ hello.name + china.name美元; })); var app2=mqyJs。applicationCreate([{名称:“直接传入范围”},你好美元,美元的世界,函数(范围,你好,美元全球美元){ 返回$ scope.name +“:”+ hello.name + world.name美元; })); var app3=mqyJs。applicationCreate([{名称:“世界上也直接传入”},美元你好,{名称:“地球”},函数(范围,你好,美元全球美元){ 返回$ scope.name +“:”+ hello.name + world.name美元; })); ($ var app4=mqyJs.applicationCreate(功能范围){ 返回scope.name美元; }); var选择={ 范围:{ 名称:“自定义范围” } }; var app5=mqyJs。applicationCreate(选择、功能范围($){ 返回scope.name美元; }); app4.run(函数(结果){ 控制台。日志(“手动调用→结果→' +结果); });//插件结束 mqyJs.applicationList。地图(函数(应用程序、索引){ 控制台。日志(“自动调用→应用# +指数+”→' + app.run ()); });详解angularjs的数组传参方式的简单实现