non posso riportare il codice complessivo da cui è estratta questa funzione perchè è molto lungo ad ogni modo cercherò di essere il più possibile chiaro
in questa funzione è scritto un ciclo do...while. notate le variabili wordWidth e fontSize, scritte all'inizio della funzione e poi di nuovo in corrispondenza di do{}(attribuendovi un valore differente). ho provato a modificare questo codice dichiarando e attribuendo valori a fontSize e wordWidth una sola volta: ho provato sia a dichiarale all'inzio della funzione init, sia all'interno di do{}, in ogni caso le due variabili erano passate una sola volta e non due volte come nel codice che ho riportato sopra:codice:function init() { readWords(); var fontSize=200; var wordWidth=0; do { wordWidth=0; fontSize-=5; wordCtx.font=fontSize+"px sans-serif"; for(var i=0;i<txt.length;i++) { var w=wordCtx.measureText(txt[i]).width; if(w>wordWidth) wordWidth=w; } } while(wordWidth>cw-50 || fontSize*txt.length > ch-50) wordCtx.clearRect(0,0,cw,ch); wordCtx.textAlign="center"; wordCtx.textBaseline="middle"; for(var i=0;i<txt.length;i++) { wordCtx.fillText(txt[i],cw/2,ch/2 - fontSize*(txt.length/2-(i+0.5))); } }
oppure cosìcodice:function init() { readWords(); wordWidth=0; fontSize=195; do { wordCtx.font=fontSize+"px sans-serif"; for(var i=0;i<txt.length;i++) { var w=wordCtx.measureText(txt[i]).width; if(w>wordWidth) wordWidth=w; } } while(wordWidth>cw-50 || fontSize*txt.length > ch-50) wordCtx.clearRect(0,0,cw,ch); wordCtx.textAlign="center"; wordCtx.textBaseline="middle"; for(var i=0;i<txt.length;i++) { wordCtx.fillText(txt[i],cw/2,ch/2 - fontSize*(txt.length/2-(i+0.5))); } }
la funzione così passata tuttavia sembra mandare in corto il browser e l'esecuzione di tutto lo script diventa molto più lenta, anzi in chrome non prende luogo il caricamento.codice:function init() { readWords(); do { wordWidth=0; fontSize=195; wordCtx.font=fontSize+"px sans-serif"; for(var i=0;i<txt.length;i++) { var w=wordCtx.measureText(txt[i]).width; if(w>wordWidth) wordWidth=w; } } while(wordWidth>cw-50 || fontSize*txt.length > ch-50) wordCtx.clearRect(0,0,cw,ch); wordCtx.textAlign="center"; wordCtx.textBaseline="middle"; for(var i=0;i<txt.length;i++) { wordCtx.fillText(txt[i],cw/2,ch/2 - fontSize*(txt.length/2-(i+0.5))); } }
come mai?
mi ha sorpreso questo comportamento: questo porzione di codice e l'intero script non è mia opera, è per questo motivo che lo sto maneggiando e sto cercando di capirlo. ma nella fattispecie mi interessa capire come mai la funzione init e il ciclo do...while prende atto solo quando le due variabili wordWidth e fontSize sono dichiarate come nel primo codice che ho scritto, vale a dire due volte, fuori e dentro il ciclo do/while.

Rispondi quotando
