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

Why does var allow duplicate declaration but why does const and let not allow duplicate declaration?

为什么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",

我在 here 中看到了一些类似的东西,

Assuming strict mode, var will let you re-declare the same variable in the same scope. On the other hand, let will not.

但是我想知道为什么letconst不允许重新申报?为什么 var 呢?以及 JavaScript 如何处理这三种类型的减速?

变量

var 关键字是 2016 年之前定义变量的唯一方法*。

无论您在哪里写 var x,变量 x 都被视为在封闭范围的顶部声明(var 的范围是 "a function").

同一范围内变量的所有声明实际上是在谈论同一个变量。

这是一个例子...你可能会认为在函数中我们用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

letconst都是block-scoped,不是function-scoped。这使得它们像大多数其他 C-like 语言中的变量一样工作。事实证明,这比 function-scoped 变量更容易混淆。

他们也是"more disciplined"。它们应该在一个块中只声明一次。

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 的一些更令人困惑的方面,例如多个声明都对同一个提升变量有贡献,以及 function-scope,您应该使用较新的 [=22] =] 和 let 个关键字。

我建议使用 const 作为您的默认关键字,并且仅在您选择允许 re-assignment.

的情况下将其升级为 let

var不同,let是ES2015规范。 specification 表示:

Redeclaring the same variable within the same function or block scope raises a SyntaxError.

这是为了改进普通版的范围var

假设您想知道此行为是否符合规范,请查看此 13.3.2

Within the scope of any VariableEnvironment a common BindingIdentifier may appear in more than one VariableDeclaration but those declarations collective define only one variable.

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

在过去 Javascript code-base 过去并没有因为太大而不必担心编程错误 而且很可能重点是确保 而不是报告变量re-declaration的错误 JS引擎应该处理它.

why does const and let not allow duplicate declaration?

c# 或 java(例如)处理重复变量名的方式有很大差异,其中名称冲突 returns 编译错误,以及它在 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();