2015-08-02 8 views
11

Se eseguo la funzione di prova nel seguente frammento di codice:Strano comportamento in funzione Javascript

function pointInside(r, p) { 
    var result = 
     (p.x >= r.location.x - r.size.width * 0.5) && 
     (p.x <= r.location.x + r.size.width * 0.5) && 
     (p.y >= r.location.y - r.size.height * 0.5) && 
     (p.y <= r.location.y + r.size.height * 0.5) 
    ; 
    return result; 
} 

function test() { 
    var rect = {}; 
    rect["location"] = { x:6, y:5 }; 
    rect["size"] = { width:10, height:8 }; 
    var p = { x:10, y:8 }; 
    var inside = pointInside(rect, p); 
    console.log(inside ? "inside" : "outside"); 
} 

allora il testo "dentro" viene scritto nella console. Grande. Ora, se cambio la funzione pointInside a questo:

function pointInside(r, p) { 
    return 
     (p.x >= r.location.x - r.size.width * 0.5) && 
     (p.x <= r.location.x + r.size.width * 0.5) && 
     (p.y >= r.location.y - r.size.height * 0.5) && 
     (p.y <= r.location.y + r.size.height * 0.5) 
    ; 
} 

poi quando chiamo la funzione di test "fuori" viene scritto nella console. In seguito a ulteriori indagini, la funzione pointInside sta effettivamente tornando indefinita. Perché? Non riesco a vedere alcuna differenza significativa tra le due versioni di pointInside. Qualcuno può spiegarmi questo?

risposta

8

Purtroppo molti interpreti JavaScript cercare di essere indulgente su punto e virgola mancante. Se hai "return" e quindi un fine riga, molti interpreti presumeranno che tu abbia dimenticato un punto e virgola. Quindi il tuo "indefinito".

+0

Anche se non sono d'accordo con molti dettagli, la sensazione generale è precisa: https://www.youtube.com/watch?v=D5xh0ZIEUOE –

+6

Questo fa parte delle specifiche, non è qualcosa che "molti interpreti cercano di fare", è qualcosa che * tutti * gli interpreti * devono * fare. –

+0

Forse devono, ma come spesso accade la realtà e gli standard non sempre si intersecano. Al momento sto usando tiny-js, un interprete incorporato per microcontrollori. Ci ritorno attende un punto e virgola, quindi non è conforme agli standard in questo senso. Non trattare con regole strane potrebbe non essere conforme, ma mantiene il codice piccolo e facile da convalidare per problemi di sicurezza. –

10

In javascript, ; è facoltativo (alla fine dell'istruzione) ... così la funzione restituisce "indefinito" (che è falso-y) e il resto del codice in quella funzione viene effettivamente ignorato ... meravigliosa isn vero?

provare le seguenti

function pointInside(r, p) { 
    return (
     (p.x >= r.location.x - r.size.width * 0.5) && 
     (p.x <= r.location.x + r.size.width * 0.5) && 
     (p.y >= r.location.y - r.size.height * 0.5) && 
     (p.y <= r.location.y + r.size.height * 0.5) 
    ); 
} 

è qualcosa che probabilmente non sarà mai risolto, questo comportamento stupido, perché si spezzerebbe troppo (scarso) Codice