2015-01-10 4 views
7

У меня есть следующая функция в JavaScript и при запуске через JSLint она кричала на меня, как я ее называю.Каков стандартный формат выражений присваивания?

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

В частности, выражение inline присваивания в цикле while. Я полагал, что двойные круглые скобки были стандартным способом сказать: «Я ожидаю, что возвращаемое значение из выражения присваивания будет занесено в тип Boolean для условного выражения». JSLint, похоже, не согласен, даже когда я включаю выражения присваивания. Затем я попытался добавить !! спереди, а JSLint жалуется, что это «запутанное использование». Итак, мой вопрос в том, как правильно форматировать это?

EDIT: Под «этим» я имел в виду конкретно выражение для встроенного присваивания. Цель моего вопроса состояла в том, чтобы прояснить, какой приемлемый стандарт для этой конкретной линии был, если кто-то действительно хотел использовать это, и хотя я согласен с тем, что ответ на этот вопрос является самым правильным способом записи функции, это не ответ на вопрос, который я задавал.

+0

Некоторое время назад была версия Opera, которая требовала двойную скобку при выполнении назначения как условия, иначе она «исправила» присвоение '=='. – RobG

+0

@RobG Eheh, я уверен, разработчики просто любили отладку _that_ one ~ –

ответ

3

Согласно this article, для JSHint, ESHint и JSLint (от до июля 2013 года) вы можете заставить его в условный, как это:

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

Для более поздних версий JSLint вы не повезло и вам нужно отделить свое задание, если вы оцениваете все зеленые.

+0

Разве это не '' undefined'' вместо '' null'' в таком случае? –

+0

@PatrickRoberts В соответствии с [docs] (https://developer.mozilla.org/en-US/docs/Web/API/HTMLElement.offsetParent) это может быть «null», если предположить, что это «HTMLElement», конечно. –

+0

Спасибо, я этого не понимал. Хороший ответ. –

2

Лучше не иметь выражений присваивания в условных выражениях. Но, я считаю, что while подходит для этого случая лучше, чем do...while. Вы можете преобразовать код в это

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

Теперь у условного выражения нет заданий, и я считаю, что это выглядит чистым.

+0

Это хорошее предложение. Мне нравится, как вы предлагаете очистить код путем изменения потока управления. Однако, если мне нужно было выбрать nit-pick, это не обязательно ответит на вопрос, потому что я попросил правильный формат для выражения встроенного присваивания. –

+0

@PatrickRoberts Я понял ваш вопрос, поэтому я начал с предложения. :) Лично я бы не использовал выражение назначения вместо условного выражения. – thefourtheye

+0

Зачем беспокоиться о * currentElement * вообще? Почему бы и нет: 'while (element) {...; element = element.offsetParent} '. Я не вижу * element *, который используется для чего-либо еще, и не модифицируется перед входом в цикл. – RobG