为什么var允许重复声明,但为什么const和let不允许重复声明?
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",
我在这里看到了一些关于它的东西,比如,
假设严格模式,
var
将允许您在同一范围内重新声明相同的变量。另一方面,let
不会。
但我想知道为什么let
和const
不允许重新声明?为什么var
允许? 以及 JavaScript 如何处理这三种类型的减速?
var
直到 2016 年*,var
关键字是定义变量的唯一方法。
无论你在哪里写var x
,变量x
都被视为在封闭作用域的顶部声明(var
的作用域是"一个函数")。
同一范围内变量的所有声明实际上都在谈论同一个变量。
下面是一个示例...你可能会认为在函数中我们用fenton
覆盖外部name
,并将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
和let
关键字。
我建议使用const
作为默认关键字,并仅在选择允许重新分配的情况下将其升级为let
。
与var
不同,let
是ES2015规范。规范说:
函数或块范围内重新声明相同的变量会引发语法错误。
这是为了改善香草var
的范围。
为什么常量和let不允许重复声明?
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();
假设您想知道此行为是否符合规范,请检查此 13.3.2
在任何变量环境的范围内,一个通用的绑定标识符可能出现在多个变量声明中,但这些声明 集体只定义一个变量。
let
和const
是最新版本,而var
可能与Javascript本身一样古老。
在过去,Javascript代码库过去不会太大而不必担心编程错误,并且很可能是确保而不是报告变量JS引擎重新声明的错误应该处理它。