为什么 var 允许重复声明,但为什么 const 和 let 不允许重复声明?



为什么var允许重复声明,但为什么const和let不允许重复声明?

var是允许重复声明

xx=1;
xx=2;
console.log(xx+xx);//4
var xx=1;
var xx=2;
console.log(xx+xx);//4

但是letconst不允许重复减速

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不会。

但我想知道为什么letconst不允许重新声明?为什么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关键字来隐式声明它们,在这种情况下,它们将被添加到全局范围内。微妙的错误经常被追踪到这一点。

让和常量

letconst都是块范围的,而不是函数范围的。这使得它们像大多数其他类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的一些更令人困惑的方面,例如多个声明都贡献到同一个提升的变量和函数作用域,你应该使用较新的constlet关键字。

我建议使用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

在任何变量环境的范围内,一个通用的绑定标识符可能出现在多个变量声明中,但这些声明 集体只定义一个变量

letconst是最新版本,而var可能与Javascript本身一样古老。

在过去,Javascript代码库过去不会太大而不必担心编程错误,并且很可能是确保而不是报告变量JS引擎重新声明的错误应该处理它

最新更新