var
允许重复声明
xx=1;
xx=2;
console.log(xx+xx);//4
var xx=1;
var xx=2;
console.log(xx+xx);//4

但let
和const
不允许重复减速
const yy=1;
const yy=2;
console.log(yy+yy);//Uncaught SyntaxError: Identifier 'yy' has already been declared",
let zz=1;
let zz=2;
console.log(zz+zz);//Uncaught SyntaxError: Identifier 'zz' has already been declared",

我在here中看到了类似的内容,
假设严格模式,
var
将允许您在同一范围内重新声明相同的变量。另一方面,let
不会。
但我想知道为什么let
和const
不允许重新声明?为什么var
会这样做?以及JavaScript如何处理这三种减速方式?
答案 0 :(得分:4)
var
关键字是在2016 *之前定义变量的唯一方法。
无论你在哪里写var x
,变量x
都被视为在封闭范围的顶部声明它(var
的范围是“一个函数”)。
同一范围内的变量的所有声明都在有效地讨论同一个变量。
以下是一个示例...您可能会认为在函数中我们用name
覆盖外部fenton
,并将Fenton
添加到内部变量...
var name = 'Ramesh';
function myFunc() {
name = 'fenton';
var name = 'Fenton';
alert(name);
}
myFunc();
alert(name);
事实上,它就像这样......由于提升,外部变量不受内部变量的影响。
var name = 'Ramesh';
function myFunc() {
var name;
name = 'fenton';
name = 'Fenton';
alert(name);
}
myFunc();
alert(name);
var
关键字来隐式声明它们,在这种情况下,它们将被添加到全局范围。经常跟踪微妙的错误。 let
和const
都是块范围的,而不是函数范围的。这使得它们在大多数其他类C语言中像变量一样工作。事实证明,这比功能范围的变量更容易混淆。
他们也“更有纪律”。它们应该在块内声明一次。
const
关键字也不允许后续分配 - 所以你必须用赋值来声明它(即你不能只写const x
,你必须写const x = 'Fenton'
) - 和你以后不能再分配另一个值。
有些人认为这会使值不可变,但这是一个错误,因为值可能会发生变异,如下所示:
const x = [];
// I can mutate even though I can't re-assign
x.push('Fenton');
// x is now ['Fenton']
如果你想避免var
的一些比较混乱的方面,比如多个声明都对同一个提升变量和函数范围有贡献,你应该使用较新的const
和{ {1}}关键字。
我建议您使用let
作为默认关键字,并仅在您选择允许重新分配的情况下将其升级为const
。
答案 1 :(得分:2)
答案 2 :(得分:2)
为什么const并且不允许重复声明?
c#或java(例如)如何处理重复的变量名称,名称冲突返回编译错误以及它如何以js之类的解释语言工作,两者之间有很大的区别。请检查以下代码段:i
的值是否重复?仍然不是真的,在函数和块上下文中,相同的变量名称被称为两个不同的变量,具体取决于声明的位置。
function checkLetDuplication() {
let i = 'function scope';
for ( let i = 0 ; i < 3 ; i++ )
{
console.log('(for statement scope): inside the for loop i, equals: ', i);
}
console.log('("checkLetDuplication" function scope): outside the for loop i , equals: ', i);
}
checkLetDuplication();
答案 3 :(得分:1)
假设您想知道此行为是否符合规范,请检查此13.3.2
在任何VariableEnvironment的范围内都有一个常见的BindingIdentifier 可能出现在多个VariableDeclaration 中,但这些声明 集体只定义一个变量。
let
和const
是最近的版本,而var
可能与Javascript本身一样古老。
过去 Javascript代码库以前没有太大而无法解决编程错误,最有可能的重点是确保而不是报告re的错误 - 变量JS引擎的声明应该处理它。