Несмотря на ES6, бывают ли случаи, когда var является наиболее подходящим ключевым словом для использования? - PullRequest
0 голосов
/ 03 мая 2018

Я постараюсь сделать это кратким ...

При всей шумихе над ES6, я чувствую, что использование ключевого слова var становится все более и более недовольным сообществом JS в целом. Из-за этого (предполагаемого) общего консенсуса я привык избегать использования var вместо новых ключевых слов const и let для создания переменных.

Ниже приведен пример блока кода, который я написал, где я не мог использовать const, потому что я хотел переопределить переменную. Я также использовал async / await, поэтому весь код был в том же block-level scope, что, очевидно, также не позволяет переопределять переменные let. Поэтому мой единственный вариант - использовать var (или создать еще одну переменную let).

Вот код. Сохранение новой учетной записи пользователя в MongoDB через Mongoose ...

router.post('/signup', async (req, res, next) => {
  const { email, password } = req.body;

  const user = await userModel.findOne({ email });
  if (user) { res.send('Email already in use.'); return; }

  // here is where the issue occurs - use var instead?
  let newUser = new userModel({ email, password });
  let newUser = await newUser.save();

  console.log(newUser); // just checking everything works

  res.send({ message: 'New user account created!' });
});

MDN упоминает об этом поведении ... только с ОДНОЙ ОТПРАВЛЕНИЕЮ! Это не полезно. :( А потом они продолжают обсуждать поведение подъема, что не является моей проблемой, или, по крайней мере, я не вижу, как это связано. Источник MDN Здесь .

Итак, в заключение ...

  • Является ли это примером того, когда var будет наиболее подходящим ключевым словом для использования?

  • Если это не время для использования var, есть ли любой экземпляр, когда var является наиболее подходящим ключевым словом для использования, даже в возрасте ES6 (7, 8 и т. Д.)

Отказ от ответственности: Я знаю, что мне совершенно не обязательно сохранять эти переменные, но, на мой взгляд, стоит компенсировать написание чуть более подробного кода, который также будет более читабельным и понятным. Я в порядке с использованием var, я просто, хотя это был интересный случай.

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Это не вопрос использования let, var или const.
В одной и той же области имя переменной не может быть объявлено более одного раза, иначе вы получите следующую ошибку; SyntaxError: Identifier 'newUser' has already been declared
Вы можете объявить один раз и назначить значение столько, сколько хотите.
let newUser = new userModel({ email, password }); newUser = await newUser.save();

0 голосов
/ 03 мая 2018

var использование часто ограничено в правилах линтера, потому что в ES6 оно может быть использовано неправильно. Это недопустимый случай для var. Как уже упоминалось в другом ответе, переменная должна быть переназначена, а не повторно объявлена:

  let newUser = new userModel({ email, password });
  newUser = await newUser.save();

Единственный действительный случай для var в ES6 - это определение глобального в области верхнего уровня:

<script>var FOO = 1;</script>

let и const приведут к ошибке Identifier has already been declared, если переменная была определена несколько раз по какой-либо причине:

<script>let FOO = 1;</script>
...
<script>let FOO = 1;</script>

И if (typeof FOO === 'undefined) защита не применима, потому что она создает область видимости блока.

Это применимо только к сценариям браузера. Сценарии Node.js оцениваются в области видимости модуля.

Альтернативы могут включать в себя this (в свободном режиме) или window свойства.

0 голосов
/ 03 мая 2018

Нет никаких причин использовать var в ES6. const должно быть вашим значением по умолчанию. Единственная причина использовать let вместо const - это когда вы хотите переназначить переменную позже в том же блоке. В этом случае вы не объявляете его снова, просто присвойте ему новое значение:

let newUser = new userModel({ email, password });
newUser = await newUser.save();
// allowed to reassign because `newUser` is not `const`

В зависимости от того, что делает save, я подозреваю, что вы могли бы просто сделать:

const newUser = new userModel({ email, password });
await newUser.save();

newUser.save(); должен отклонить обещание, которое он возвращает в случае неудачного сохранения, которое ожидает преобразования в выданную ошибку. Поэтому не должно быть вопросов о том, удалось ли сохранить код в этом коде после этого await. Если эти строки достигнуты, сохранение выполнено успешно.

...