2015-01-10 10 views
7

Ho la seguente funzione in JavaScript e durante l'esecuzione tramite JSLint, mi ha urlato contro, come la chiamo io.Qual è il formato standard per le espressioni di assegnazione?

function getPos(event, element) { 
    var x = event.clientX, 
     y = event.clientY, 
     currentElement = element; 

    do { 
     x -= currentElement.offsetLeft - currentElement.scrollLeft; 
     y -= currentElement.offsetTop - currentElement.scrollTop; 
    } while ((currentElement = currentElement.offsetParent)); 

    return { 
     x: x, 
     y: y 
    }; 
} 

In particolare sull'espressione dell'assegnazione inline nel ciclo while. Ho immaginato che la doppia parentesi fosse il modo standard per dire: "Mi aspetto che il valore restituito dall'espressione di assegnazione venga digitato in un codice Boolean per il condizionale". JSLint sembra essere in disaccordo, anche quando abilito le "espressioni di assegnazione". Poi ho provato ad aggiungere uno !! davanti e JSLint si lamenta che si tratta di "uso confuso". Quindi la mia domanda è, qual è il modo giusto per formattare questo?

MODIFICA: Con "questo", intendevo specificamente l'espressione dell'assegnazione in linea. L'intento della mia domanda era di chiarire quale fosse uno standard accettabile per quella particolare linea, se si voleva davvero usarlo, e anche se sono d'accordo sul fatto che la risposta di courtèye è il modo più corretto per scrivere la funzione, non è la risposta a la domanda che stavo chiedendo.

+0

C'era una versione di Opera qualche tempo fa che richiedeva la doppia parentesi quando si eseguiva l'assegnazione come condizione, altrimenti avrebbe "corretto" l'assegnazione a '=='. – RobG

+0

@RobG Eheh, scommetto che gli sviluppatori adoravano il debug di _that_ one ~ –

risposta

3

Secondo this article, per JSHint, ESHint e JSLint (da prima del luglio 2013) è possibile forzare in una condizione come questa:

do { 
    // ... 
} while ((currentElement = currentElement.offsetParent) !== null); 

Per le versioni più recenti di JSLint sei fuori di fortuna e devi separare il tuo incarico se apprezzi tutto il verde.

+0

Non sarebbe '' undefined'' invece di '' null'' in quel caso, allora? –

+0

@PatrickRoberts Secondo [docs] (https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.offsetParent) potrebbe essere 'null', assumendo che sia un' HTMLElement', ovviamente. –

+0

Grazie, non l'ho capito. Bella risposta. –

2

È meglio non avere espressioni di assegnazione nelle espressioni condizionali. Ma, credo che while si addicesse a questo caso meglio di do...while. Si potrebbe trasformare il codice a questo

function getPos(event, element) { 
    var x = event.clientX, 
     y = event.clientY, 
     currentElement = element; 

    while (currentElement) { 
     x -= currentElement.offsetLeft - currentElement.scrollLeft; 
     y -= currentElement.offsetTop - currentElement.scrollTop; 
     currentElement = element.offsetParent; 
    } 

    return { 
     x: x, 
     y: y 
    }; 
} 

Ora, non v'è alcuna assegnazione coinvolti nell'espressione condizionale e credo che questo sembra pulito.

+0

Questo è un buon suggerimento. Mi piace come si propone di rendere il codice più pulito modificando il flusso di controllo. Tuttavia, se dovessi scegliere la nit-pick, questo non risponde _realmente_ alla domanda, perché ho chiesto il formato corretto per l'espressione dell'assegnazione inline. –

+0

@PatrickRoberts Ho capito la tua domanda, ecco perché ho iniziato con una suggerimento :) Personalmente, non userei l'espressione di assegnazione al posto di un'espressione condizionale. – thefourtheye

+0

Perché preoccuparsi di * currentElement *? Perché no: 'while (elemento) {...; element = element.offsetParent} '. Non vedo * elemento * usato per qualcos'altro, né viene modificato prima di entrare nel ciclo. – RobG

Problemi correlati