Неожиданное присваивание в операторе do ... while.Почему это плохая практика и что я могу сделать вместо этого? - PullRequest
0 голосов
/ 20 сентября 2018

Я получаю ошибку eslint: [eslint] Неожиданное присваивание в операторе do ... while.(no-cond-assign)

Почему это происходит?Что я могу сделать, чтобы это исправить?Почему мне не разрешено это делать?Почему это плохая практика?

window.smoothScroll = function (target) {
    let scrollContainer = target;
    do {
        scrollContainer = scrollContainer.parentNode;
        if (!scrollContainer) return;
        scrollContainer.scrollTop += 1;
    } while (scrollContainer.scrollTop === 0);

    let targetY = 0;
    do {
        if (target === scrollContainer) break;
        targetY += target.offsetTop;
    } while (target = target.offsetParent);

    const scroll = (c, a, b, i) => {
        i += 1; if (i > 30) return;
        c.scrollTop = (((a + (b - a)) / 30) * i);
        setTimeout(() => { scroll(c, a, b, i); }, 10);
    };
    scroll(scrollContainer, scrollContainer.scrollTop, targetY, 0);
};

1 Ответ

0 голосов
/ 20 сентября 2018

while ожидает выражение , тогда как target = target.offsetParent является присваиванием .В то время как присваивание оценивает выражения, очень часто его использование является либо ошибкой, либо запахом кода.Например, как объясняет линтер:

if (user.jobTitle = "manager") {

Код выше почти наверняка опечатка.Если вы хотите присвоить переменную, лучше сделать это в отдельной строке, а не в выражении, чтобы сделать ваш код понятным для будущих читателей (включая вас).

В вашем коде вы могли быисправить это, присвоив target в нижней части do, а затем поставить target в while условие:

do {
  if (target === scrollContainer) break;
  targetY += target.offsetTop;
  target = target.offsetParent
} while (target);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...