尽管有ES6,但var是否是最适合使用的关键字的实例?

时间:2018-05-03 05:16:49

标签: javascript ecmascript-6 async-await syntax-error

我试着简明扼要......

随着所有ES6的炒作,我觉得使用var关键字变得越来越不受JS社区的欢迎。由于这种(感知的)普遍共识,我一直养成避免使用var代替较新的constlet关键字来创建变量的习惯。

下面是我编写的一段代码示例,我无法使用const,因为我想重新定义一个变量。我还在使用async / await,因此所有代码都在同一个block-level scope中,这显然会阻止您重新定义let个变量。所以我唯一的选择是使用var(或创建另一个let变量)。

这是代码。通过Mongoose将新用户帐户保存到MongoDB ...

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 Source Here

总之......

  • 这是var最适合使用的关键字的实例示例吗?

  • 如果这不是使用var的时间,那么当var是最合适的关键字时,是否有任何实例,即使在ES6的年龄(7,8岁等)?

免责声明:我知道我并不是绝对需要保存这些变量,但在我看来,值得权衡的是编写更详细的代码&#39 ; s也更具可读性和可理解性。我使用var很好,我只是这是一个有趣的案例。

3 个答案:

答案 0 :(得分:3)

没有理由在ES6中使用varconst应该是您的默认值。使用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();应拒绝它返回的Promise,等待将转换为抛出的错误。因此,在await之后,代码中的保存是否成功应该毫无疑问。如果到达那些行,则保存成功。

答案 1 :(得分:1)

这不是使用letvarconst的问题。
在同一范围内,变量名称不能多次声明,否则会出现以下错误; SyntaxError: Identifier 'newUser' has already been declared
您可以声明一次,然后指定值。
let newUser = new userModel({ email, password }); newUser = await newUser.save();

答案 2 :(得分:1)

var使用通常在linter规则中受到限制,因为它很容易在ES6中被滥用。这不是var的有效案例。正如另一个答案所提到的,变量应该重新分配,而不是重新声明:

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

ES6中var的唯一有效案例是在顶级范围内定义全局:

<script>var FOO = 1;</script>
如果由于某种原因多次定义变量,

letconst将导致Identifier has already been declared错误:

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

并且if (typeof FOO === 'undefined)安全措施不适用,因为它会创建块范围。

这仅适用于浏览器脚本。 Node.js脚本在模块范围内进行评估。

替代方案可能涉及引用this(在宽松模式下)或window属性。