zoukankan      html  css  js  c++  java
  • 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     };
  • 相关阅读:
    梯度下降_机器学习-李宏毅
    LeTex算法伪代码环境
    数据结构之线性表
    Java中的初始化块、构造器、静态初始化块的执行顺序
    Java中的内省(introspector)
    JSP (Java Server Page)
    eclipse的web工程默认部署到了哪里
    Persistence机制(永久保存/序列化Serialize)
    VC++中使用正则表达式RegExp
    Java中解析和生成xml
  • 原文地址:https://www.cnblogs.com/formyjava/p/4167651.html
Copyright © 2011-2022 走看看