2015-01-10 8 views
7

Ich habe die folgende Funktion in JavaScript und beim Ausführen durch JSLint, schrie es mich an, wie ich es nenne.Was ist das Standardformat für Zuweisungsausdrücke?

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 
    }; 
} 

Speziell über die Inline-Zuweisung Ausdruck in der While-Schleife. Ich dachte mir, dass die doppelten Klammern die übliche Art zu sagen waren: "Ich erwarte, dass der zurückgegebene Wert aus dem Zuweisungsausdruck für die Bedingung in eine geschrieben wird." JSLint scheint nicht zu stimmen, auch wenn ich "Zuweisungsausdrücke" aktiviere. Dann habe ich versucht, eine !! in Front hinzuzufügen, und JSLint beschwert sich, dass es "verwirrende Nutzung" ist. Also meine Frage ist, was ist der richtige Weg, dies zu formatieren?

EDIT: Mit "dies" meinte ich speziell die Inline-Zuweisung Ausdruck. Die Absicht meiner Frage war zu klären, was ein akzeptabler Standard für diese bestimmte Linie war, wenn man das wirklich benutzen wollte, und obwohl ich stimme, dass die Antwort des Auges die korrekteste Art ist, die Funktion zu schreiben, ist es nicht die Antwort darauf Die Frage, die ich gestellt habe.

+0

Es gab eine Version von Opera vor einiger Zeit, die die doppelte Klammer bei der Zuweisung als Bedingung benötigte, andernfalls würde sie die Zuweisung zu '==' "korrigieren". – RobG

+0

@RobG Eheh, ich wette, Entwickler liebten Debuggen _that_ one ~ –

Antwort

3

Nach this article, für JSHint, ESHint und JSLint (aus der Zeit vor Juli 2013), können Sie es zwingen, in eine bedingte wie folgt aus:

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

Für neuere Versionen von JSLint Sie kein Glück und Sie müssen Ihre Aufgabe trennen, wenn Sie das alles grün bewerten.

+0

Wäre es nicht "undefined" statt "null" in diesem Fall, dann? –

+0

@PatrickRoberts Nach dem [docs] (https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.offsetParent) kann es 'null' sein, vorausgesetzt, es ist natürlich ein' HTMLElement'. –

+0

Danke, das habe ich nicht verstanden. Gute Antwort. –

2

Es ist besser, keine Zuweisungsausdrücke in Bedingungsausdrücken zu haben. Aber ich glaube, dass while diesem Fall besser als do...while entsprechen würde. Sie könnten den Code in diesen

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 
    }; 
} 

verwandeln Jetzt ist keine Zuweisung in den bedingten Ausdruck beteiligt und ich glaube, das sieht sauber aus.

+0

Das ist ein guter Vorschlag. Ich mag es, wie Sie den Code sauberer machen wollen, indem Sie den Kontrollfluss ändern. Allerdings, wenn ich nit-Pick, dies nicht wirklich beantworten die Frage, weil ich nach dem richtigen Format für die Inline-Zuweisung Ausdruck gefragt. –

+0

@PatrickRoberts Ich habe deine Frage verstanden, deshalb habe ich mit einer Suggestion begonnen :) Persönlich würde ich keinen Zuweisungsausdruck anstelle eines bedingten Ausdrucks verwenden. – thefourtheye

+0

Warum mit * currentElement * überhaupt etwas anfangen? Warum nicht: 'while (element) {...; element = element.offsetParent} '. Ich sehe nicht, dass * element * für irgendetwas anderes verwendet wird, noch wird es vor dem Eintritt in die Schleife modifiziert. – RobG