我试着简明扼要......
随着所有ES6的炒作,我觉得使用var
关键字变得越来越不受JS社区的欢迎。由于这种(感知的)普遍共识,我一直养成避免使用var
代替较新的const
和let
关键字来创建变量的习惯。
下面是我编写的一段代码示例,我无法使用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
很好,我只是这是一个有趣的案例。
答案 0 :(得分:3)
没有理由在ES6中使用var
。 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();
应拒绝它返回的Promise,等待将转换为抛出的错误。因此,在await
之后,代码中的保存是否成功应该毫无疑问。如果到达那些行,则保存成功。
答案 1 :(得分:1)
这不是使用let
,var
或const
的问题。
在同一范围内,变量名称不能多次声明,否则会出现以下错误;
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>
如果由于某种原因多次定义变量, 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
属性。