2009-11-10 3 views
-1

Je pense que je mets la fonction anonyme là-bas mal ... quand il sort listzonebuffs il comprend la fonction() {... partie.erreur Javascript

function load(zone){ 

setupzonebuffs(zone); 

document.getElementById('zonetitle').innerHTML=zone; 

listzonebuffs=""; 
if(zonebuffs['B']!=1){listzonebuffs+="<span class=\'"+function(){if(zonebuffs["B"]>1){return "good";}else{return "bad";}}+"\'>Brute Force "+function(){if(zonebuffs['B']>1){return "+";}else{return "-";}}+" "+Math.round(Math.abs((1-zonebuffs['B'])*100))+"%</span>";} 
if(zonebuffs['W']!=1){listzonebuffs+="<span class=\'"+function(){if(zonebuffs["W"]>1){return "good";}else{return "bad";}}+"\'>Wind "+function(){if(zonebuffs['W']>1){return "+";}else{return "-";}}+" "+Math.round(Math.abs((1-zonebuffs['W'])*100))+"%</span>";} 
if(zonebuffs['I']!=1){listzonebuffs+="<span class=\'"+function(){if(zonebuffs["I"]>1){return "good";}else{return "bad";}}+"\'>Ice "+function(){if(zonebuffs['I']>1){return "+";}else{return "-";}}+" "+Math.round(Math.abs((1-zonebuffs['I'])*100))+"%</span>";} 
if(zonebuffs['E']!=1){listzonebuffs+="<span class=\'"+function(){if(zonebuffs["E"]>1){return "good";}else{return "bad";}}+"\'>Energy "+function(){if(zonebuffs['E']>1){return "+";}else{return "-";}}+" "+Math.round(Math.abs((1-zonebuffs['E'])*100))+"%</span>";} 
if(zonebuffs['F']!=1){listzonebuffs+="<span class=\'"+function(){if(zonebuffs["F"]>1){return "good";}else{return "bad";}}+"\'>Fire "+function(){if(zonebuffs['F']>1){return "+";}else{return "-";}}+" "+Math.round(Math.abs((1-zonebuffs['F'])*100))+"%</span>";} 
if(zonebuffs['R']!=1){listzonebuffs+="<span class=\'"+function(){if(zonebuffs["R"]>1){return "good";}else{return "bad";}}+"\'>Earth "+function(){if(zonebuffs['R']>1){return "+";}else{return "-";}}+" "+Math.round(Math.abs((1-zonebuffs['R'])*100))+"%</span>";} 
if(zonebuffs['A']!=1){listzonebuffs+="<span class=\'"+function(){if(zonebuffs["A"]>1){return "good";}else{return "bad";}}+"\'>Astronomical "+function(){if(zonebuffs['A']>1){return "+";}else{return "-";}}+" "+Math.round(Math.abs((1-zonebuffs['A'])*100))+"%</span>";} 
if(zonebuffs['S']!=1){listzonebuffs+="<span class=\'"+function(){if(zonebuffs["S"]>1){return "good";}else{return "bad";}}+"\'>Stealth "+function(){if(zonebuffs['S']>1){return "+";}else{return "-";}}+" "+Math.round(Math.abs((1-zonebuffs['S'])*100))+"%</span>";} 
document.getElementById('listzonebuffs').innerHTML=listzonebuffs; 

} 

var zonebuffs=new Array(); 
zonebuffs['B']=1;zonebuffs['W']=1;zonebuffs['I']=1;zonebuffs['E']=1;zonebuffs['F']=1;zonebuffs['R']=1;zonebuffs['A']=1;zonebuffs['S']=1; 

function setupzonebuffs(zone){ 
switch(zone){ 
case 'Mist': 
zonebuffs['S']=1.3;zonebuffs['W']=1.1;zonebuffs['F']=.9; 
break; 
} 
} 
+10

qui est tout simplement terrible. – pstanton

+2

Quelques boucles feraient ce code des merveilles. – Nosredna

+4

La touche de retour arrière ferait ce code des merveilles. – aehiilrs

Répondre

10

Vous devez nettoyer ce code (honnêtement, il est illisible) et essayez de remplacer: +function(){if(COND){A}{B}}+ par +(COND ? A : B)+

+0

Je ne sais pas si j'ai déjà vu un cas pour utiliser le ternaire pour rendre le code plus clair avant. :-) Honnêtement, je peux penser à dix choses à faire pour nettoyer ça avant le ternaire. # 1 SEC! – Nosredna

+0

whoah! Je n'ai jamais su que vous pourriez le faire ... maintenant je me sens stupide ... –

+0

et cela l'a corrigé ... ty –

5

C'est parce que probablement au lieu d'ajouter l'objet fonction à la chaîne, vous vouliez ajouter le résultat appel de fonction, qui est, au lieu de

x += "<span ...>" + function() { ... } + ... 

vous Probab J'ai voulu

x += "<span ...>" + (function() { ... })() + ... 

Cependant, je dois dire que votre question n'est pas très évidente. La prochaine fois, essayez de fournir un échantillon plus petit avec le problème localisé et expliquez-le plus clairement. Tout en faisant cela, la plupart du temps, les gens finissent par déterminer la solution eux-mêmes ...

2

Utilisez l'opérateur ternaire au lieu de la fonction

Lorsque vous utilisez des fonctions anonymes, la valeur retournée est une fonction.

Exemple:

var func_a = function(){ 
    alert('testing'); 
} 
func_a(); 

Dans votre cas ce que vous avez besoin est d'utiliser l'opérateur ternaire, qui retourne conditionnellement la valeur en fonction de l'expression.

CONDITION ? TRUE : FALSE, où basé sur CONDITION, la valeur TRUE ou FALSE sera retournée.

Votre code fixe:

function load(zone){ 

setupzonebuffs(zone); 

document.getElementById('zonetitle').innerHTML=zone; 

listzonebuffs=""; 
if(zonebuffs['B']!=1){listzonebuffs+="<span class=\'"+(zonebuffs["B"]>1?"good":"bad")+"\'>Brute Force "+(zonebuffs['B']>1?"+":"-")+" "+Math.round(Math.abs((1-zonebuffs['B'])*100))+"%</span>";} 
if(zonebuffs['W']!=1){listzonebuffs+="<span class=\'"+(zonebuffs["W"]>1?"good":"bad")+"\'>Wind "+(zonebuffs['W']>1?"+":"-")+" "+Math.round(Math.abs((1-zonebuffs['W'])*100))+"%</span>";} 
if(zonebuffs['I']!=1){listzonebuffs+="<span class=\'"+(zonebuffs["I"]>1?"good":"bad")+"\'>Ice "+(zonebuffs['I']>1?"+":"-")+" "+Math.round(Math.abs((1-zonebuffs['I'])*100))+"%</span>";} 
if(zonebuffs['E']!=1){listzonebuffs+="<span class=\'"+(zonebuffs["E"]>1?"good":"bad")+"\'>Energy "+(zonebuffs['E']>1?"+":"-")+" "+Math.round(Math.abs((1-zonebuffs['E'])*100))+"%</span>";} 
if(zonebuffs['F']!=1){listzonebuffs+="<span class=\'"+(zonebuffs["F"]>1?"good":"bad")+"\'>Fire "+(zonebuffs['F']>1?"+":"-")+" "+Math.round(Math.abs((1-zonebuffs['F'])*100))+"%</span>";} 
if(zonebuffs['R']!=1){listzonebuffs+="<span class=\'"+(zonebuffs["R"]>1?"good":"bad")+"\'>Earth "+(zonebuffs['R']>1?"+":"-")+" "+Math.round(Math.abs((1-zonebuffs['R'])*100))+"%</span>";} 
if(zonebuffs['A']!=1){listzonebuffs+="<span class=\'"+(zonebuffs["A"]>1?"good":"bad")+"\'>Astronomical "+(zonebuffs['A']>1?"+":"-")+" "+Math.round(Math.abs((1-zonebuffs['A'])*100))+"%</span>";} 
if(zonebuffs['S']!=1){listzonebuffs+="<span class=\'"+(zonebuffs["S"]>1?"good":"bad")+"\'>Stealth "+(zonebuffs['S']>1?"+":"-")+" "+Math.round(Math.abs((1-zonebuffs['S'])*100))+"%</span>";} 
document.getElementById('listzonebuffs').innerHTML=listzonebuffs; 

} 

var zonebuffs=new Array(); 
zonebuffs['B']=1;zonebuffs['W']=1;zonebuffs['I']=1;zonebuffs['E']=1;zonebuffs['F']=1;zonebuffs['R']=1;zonebuffs['A']=1;zonebuffs['S']=1; 

function setupzonebuffs(zone){ 
switch(zone){ 
case 'Mist': 
zonebuffs['S']=1.3;zonebuffs['W']=1.1;zonebuffs['F']=.9; 
break; 
} 
} 

S'il vous plaît le formatage ...

Et pour réduire la redondance:

function cond1(val){ 
    return (val>1?"good":"bad"); 
} 

function cond2(val){ 
    return (val>1?"+":"-"); 
} 
function val1(val){ 
    return Math.round(Math.abs((1-val)*100)); 
} 
if(zonebuffs['A']!=1){listzonebuffs+="<span class=\'"+cond1(zonebuffs["A"])+"\'>Astronomical "+cond2(zonebuffs['A'])+" "+val1(zonebuffs['A'])+"%</span>";} 
if(zonebuffs['S']!=1){listzonebuffs+="<span class=\'"+cond1(zonebuffs["S"])+"\'>Stealth "+cond2(zonebuffs['S'])+" "+val1(zonebuffs['S'])+"%</span>";} 
0

cela pourrait être une bonne application pour une fonction dans un fonction. Vous pouvez essayer quelque chose comme ceci:

function load(zone){ 
     setupzonebuffs(zone); 
     document.getElementById('zonetitle').innerHTML=zone; 

     var oneCompare = function(val, onTrue, onFalse){ 
      return (val > 1) ? onTrue : onFalse; 
     }; 

     listzonebuffs=""; 
     if(zonebuffs['B']!=1){listzonebuffs+="<span class=\'"+oneCompare(zonebuffs["B"],'good','bad')+"\'>Brute Force "+oneCompare(zonebuffs["B"],'+','-')+" "+Math.round(Math.abs((1-zonebuffs['B'])*100))+"%</span>";} 
     //More... 

} 
1

Vous créez seulement une fonction, pendant que vous l'appellerons - l'ajout() après la fermeture de définition de fonction résout le problème. Mais la solution est plus simple à utiliser

if(zonebuffs['W']!=1){listzonebuffs+="1? "good" : "bad") +"\'>Wind "+ (zonebuffs['W']>1 ? "+": "-")+" "+Math.round(Math.abs((1-zonebuffs['W'])*100))+"%";}
3

Mauris était sur la bonne voie, mais il y a encore une violation « sec » à l'œuvre ici. Cela contribue beaucoup à l'illisibilité du code. Cela rend également beaucoup plus difficile de comprendre ce qui ne va pas.

Si vous pouviez résister à l'envie de couper et coller autant, et faire un peu plus de réflexion à l'avant, vous pouvez vous épargner beaucoup d'agonie et profiter du processus beaucoup plus.

Voilà mon avis sur le code:

function goodOrBad (key){ 
    if(zonebuffs[key] > 1){ 
     return "good"; 
    } else { 
     return "bad"; 
    } 
} 


function percentageFor (key){ 
    return (zonebuffs[key] > 1 ? "+" : "-") + " " + Math.round(Math.abs((1-zonebuffs['W'])*100))+"%"; 
} 

function textForZoneBuff(key, zone) { 
    if(zonebuffs[key]!=1){ 
    return "<span class='"+ goodOrBad(key) + "'>" + zone + " " + percentageFor(key) + "</span> "; 
    } else { 
    return ""; 
    } 
} 

function load(zone){ 

    setupzonebuffs(zone); 
    document.getElementById('zonetitle').innerHTML=zone; 

    listzonebuffs= textForZoneBuff('B','Brute Force') 
       + textForZoneBuff('W','Wind') 
       + textForZoneBuff('I','Ice') 
       + textForZoneBuff('E','Energy') 
       + textForZoneBuff('F','Fire') 
       + textForZoneBuff('R','Earth') 
       + textForZoneBuff('A','Astronomical') 
       + textForZoneBuff('S','Stealth'); 

    document.getElementById('listzonebuffs').innerHTML=listzonebuffs; 
} 


var zonebuffs=new Array(); 

zonebuffs['B']=1;zonebuffs['W']=1;zonebuffs['I']=1;zonebuffs['E']=1;zonebuffs['F']=1;zonebuffs['R']=1;zonebuffs['A']=1;zonebuffs['S']=1; 

function setupzonebuffs(zone){ 
switch(zone){ 
case 'Mist': 
zonebuffs['S']=1.3;zonebuffs['W']=1.1;zonebuffs['F']=.9; 
break; 
} 
} 

Ahhh ... maintenant je peux voir à nouveau droit :-)

+0

+1 Sur quoi je travaillais, seulement un meilleur exemple du principe DRY. –

+0

Oui, c'est ce que je pensais. Sauf que je ferais tableau littéral: [["B", "BruteForce"] ["W", "Wind"] ["I", "Ice"]] et travailler à partir de là. – Nosredna