首页 > 代码库 > AngularJS中的DI
AngularJS中的DI
AngularJS中的DI
一直以为Angular中的DI是很高大上的东西,也自己写过一个DI的demo,知道其中的难点就是最后动态代码的执行:我现在知道了参数的值,也知道了我要执行的方法/创建对象的类,那么在参数个数是动态的情况下,怎么才能执行这个方法或者新建对象呢?在我的demo中我选择的是用eval
可是当我看到AngularJS源码中有如下的语句时:
1 switch (self ? -1 : args.length) { 2 case 0: return fn(); 3 case 1: return fn(args[0]); 4 case 2: return fn(args[0], args[1]); 5 case 3: return fn(args[0], args[1], args[2]); 6 case 4: return fn(args[0], args[1], args[2], args[3]); 7 case 5: return fn(args[0], args[1], args[2], args[3], args[4]); 8 case 6: return fn(args[0], args[1], args[2], args[3], args[4], args[5]); 9 case 7: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);10 case 8: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7]);11 case 9: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8]);12 case 10: return fn(args[0], args[1], args[2], args[3], args[4], args[5], args[6], args[7], args[8], args[9]);13 default: return fn.apply(self, args);14 }
瞬间醉了。AngularJS竟然枚举了11种情况,然后根据参数个数去选择相应的情况。我觉得这是最笨最傻大粗的方法了。可是我却不觉得会比谷歌那帮家伙还有经验,这么做肯定有理由。查阅资料发现:
1.在strict模式下eval根本用不了
2.无论是fn.apply()还是fn.call()都比fn()来的慢
那么我在javascript的DI中的getBean方法应该改为:
1 //核心方法 2 di.getBean=function(beanName){ 3 //查看缓存,有的话直接返回 4 if(beans[beanName]!=undefined) 5 return beans[beanName]; 6 console.log("haha"+beanName); 7 var fn=this.config[beanName]; 8 if(fn==undefined) return; 9 var args=getArguments(fn);10 if(!args) args=[];11 var argss=new Array();12 var objstr="";13 var index=0;14 var obj;15 for(var i in args){16 argss[i]=(di.getBean(args[i]));17 objstr+="argss["+index+"],";18 index++;19 }20 objstr=objstr.substring(0, objstr.length-1);21 objstr="obj=new (fn)("+objstr+"); ";22 /*整个方法能够实现就靠这个eval方法了,23 它接受一个String参数,并把String里面的内容按照Javasript的标准编译并执行24 最牛叉的是eval里面的变量也遵循Javascript的函数作用域:也就是变量可以定义在eval外面*/25 switch(args.length){26 case 0:obj= new fn();break;27 case 1:obj= new fn(argss[0]);break;28 case 2:obj= new fn(argss[0],argss[1]);break;29 case 3:obj= new fn(argss[0],argss[1],argss[2]);break;30 default:31 eval(objstr);break;32 }33 beans[beanName]=obj;34 return obj;35 };
AngularJS中的DI
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。