javascript
  • for-loop
  • memory-management
  • runtime-error
  • 2014-12-25 8 views 5 likes 
    5

    Di seguito è il mio codiceFirefox errore lancio js in per ciclo "allocazione dimensioni overflow"

    Lo stesso codice funziona nel server locale ma non in live.

    htmlC = ""; 
        htmlC += '<select name="pagenum" id="pagenum" style="width:135px" onChange="setPageSearchValue(this.value)">'; 
        for(i=1 ; i<=tot_pages ; i++) 
        { 
          if(i.toString() == document.frmlist.start.value) 
          { 
           htmlC += "<option value='"+i+"' 'selected' >"+i+"</option>"; 
          } 
          else 
          { 
           htmlC += "<option value='"+i+"'>"+i+"</option>"; 
          } 
        } 
        htmlC += '</select>'; 
    

    Ho provato a trovare il ciclo infinito ma non ha avuto successo. Lo stesso codice funziona nel server locale.

    +3

    dove impostate tot_pages e a quale valore? – lukkea

    +0

    in realtà è stato impostato .. Non ho incollato tutto il mio codice – Rajasekhar

    +0

    Siamo spiacenti, non ero chiaro. Per favore puoi condividere quel codice con noi? Nel contesto. – lukkea

    risposta

    15

    L'utilizzo della concatenazione di stringhe in questo modo è in genere una cattiva idea, soprattutto se non si conosce il numero di iterazioni che si stanno eseguendo. Ogni volta che si concatenare una stringa, si riallocare la memoria necessaria per adattarsi alla nuova stringa e la necessità di spazzatura raccogliere quello vecchio (che potrebbe anche non essere fatto durante il ciclo per motivi di prestazioni)

    var htmlBuffer = []; 
    htmlBuffer.push('<select name="pagenum" id="pagenum" style="width:135px" onChange="setPageSearchValue(this.value)">'); 
    for(i=1 ; i<=tot_pages ; i++) 
    { 
         if(i.toString() == document.frmlist.start.value) 
         { 
          htmlBuffer.push("<option value='"+i+"' 'selected' >"+i+"</option>"); 
         } 
         else 
         { 
          htmlBuffer.push("<option value='"+i+"'>"+i+"</option>"); 
         } 
    } 
    htmlBuffer.push('</select>'); 
    
    htmlC = htmlBuffer.join('\n'); 
    

    È possibile che questo testamento definire una matrice, a cui si spinge ogni "riga" su. Assegnerà dinamicamente la memoria necessaria per i dati in espansione e infine alloca 1 stringa per la quantità totale di dati. Questo è molto più efficiente. Non so se questo è il vero problema nel tuo caso (dato che non sappiamo cosa sono tot_pages), ma non è mai una cattiva idea evitare comunque le concatenazioni di stringhe nei loop.

    Problemi correlati