2016-07-01 60 views
0

Ich habe ein Problem mit dem folgenden Code. Wenn s.q.has('on') in die Konsole eingegeben wird, tritt ein Max-Stapelfehler auf.Hilfe bei der Suche nach der Quelle eines nicht erfassten RangeError: Die maximale Callstack-Größe wurde überschritten.

Ich weiß, das bedeutet, es ist eine Schleife in die Unendlichkeit irgendwie-Ding, aber ich habe noch das Problem zu isolieren. Dies liegt sicherlich an dem Mangel an Wissen über die Werkzeuge, die ich verwende. Obwohl ich schließlich herausfinden werde, was passiert, würde ich gerne Ihre Eingabe auf Ortung das Problem ... Entschuldigung für den langen Arsch Code-Block, es ist so klein, wie ich es zuschneiden konnte und immer noch den Fehler.

var q=new function(){ 
    var u,q; 
    q_set_proto(); 
    q=new function Q(){ 
     this.ex=q_exist; 
     this.tf=q_true_false; 
     Object.setPrototypeOf(this.__proto__,null); 
    }; 
    $(document).ready(q_boot); 
    console.warn(q); 
    return q; 
    function q_set_proto(){ 
     Object.defineProperty(Object.prototype,'q',{get:function(){ 
      var slf,slfCon,q,cat,i; 
      slf=this; 
      slfCon=this.constructor; 
      if(slfCon==String || slfCon==Number) 
       slf=slf.valueOf(); 
      q={ 
       get isStr(){return qp_isStr.call(slf)}, 
       get cons(){return qp_constructor.call(slf)}, 
      }; 
      if(slfCon==String){ 
       cat={ 
        get trm(){return qp_string_trim.call(slf)}, 
        has : function(a,b){return qp_string_has.call(slf,a,b)}, 
       }; 
      }; 
      if(cat) 
       for(i in cat) 
        Object.defineProperty(q,i, 
         Object.getOwnPropertyDescriptor(cat,i) 
        ); 
      return q; 
     }}); 
    }; 
    function qp_isStr(){ 
     return this.q.cons==String; 
    }; 
    function qp_constructor(){ 
     return this.constructor; 
    }; 
    function qp_string_trim(){ 
     return this.q.trm; 
    }; 
    function qp_string_has(px,py){ 
     if(!q.ex(px) || !px.q.isStr && !px.q.isAry) 
      return null; 
     if(q.ex(py)) 
      if(!py.q.isNum || py!=0 && py!=1) 
       return null; 
     var len,c,i; 
     if(px.q.isStr){ 
      if(!px.q.trm) 
       return null; 
      return this.q.dex(px)>=0; 
     }; 
     len=px.q.len; 
     if(!len) 
      return null; 
     c=0; 
     for(i in px){ 
      if(!px[i].q.isStr || !px[i].q.trm) 
       return null; 
      c+=q.tf(this.q.dex(px[i])>=0); 
     }; 
     if(!q.ex(py)) 
      return c==len; 
     if(!py) 
      return c==0; 
     return c>0; 
     /****************************** 
     s = offer coffee only on monday 

     s.q.has('on') 
     s.q.has(['on','off'])  - all 
     s.q.has(['one','two'],0) - none 
     s.q.has(['one','off'],1) - any 
     /******************************/ 
    }; 
    function q_boot(){ 
     s='offer coffee only on monday'; 
     console.debug(s); 
    }; 
    function q_exist(tgt){ 
     return (tgt!==null && tgt!==u); 
    }; 
    function q_true_false(con,t,f){ 
     if(!q.ex(t)){ 
      t=1;f=0; 
     }; 
     return (con) ? t:f; 
    }; 
}; 
+0

Ihr Code gibt 'InternalError: zu viel Rekursion 'zurück, wenn' sqhas (' on ') 'auf firebug ausgeführt wird, was darauf hinweist, dass der Fehler in Zeile 45 auftritt – amine

Antwort

0

Ja mein Schlechter!

function qp_string_trim(){ 
    return this.q.trm; 
}; 

Sollte sein:

function qp_string_trim(){ 
    return this.trim(); 
}; 

Sorry, Jungs. Habe gesagt, ich würde es aber irgendwann knacken ...

+0

Was ist mit allen Variablennamen eines Buchstabens? –

+0

sagen Sie mir, welche würden Sie bevorzugen, eine Milliarde Male in Ihrem Leben zu tippen? 'für (Index in x) {...}' oder 'für (i in x) {...}' – LostInCyberSpace

+0

Der, der Sinn macht, wenn ich (oder irgendein anderer armer Rasen) zurückgehen und es lesen muss. Verwenden von 'i',' j', 'k', für Schleifen ist Konvention, die Verwendung einzelner Buchstaben für andere Dinge ist in der Regel nicht (x/y für einen Punkt ist ein Gegenbeispiel). –