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

时间:2018-03-07 09:15:04

标签: javascript angular typescript variables var

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

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中看到了类似的内容,

  

假设严格模式,var将允许您在同一范围内重新声明相同的变量。另一方面,let不会。

但我想知道为什么letconst不允许重新声明?为什么var会这样做?以及JavaScript如何处理这三种减速方式?

4 个答案:

答案 0 :(得分:4)

VAR

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

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的一些比较混乱的方面,比如多个声明都对同一个提升变量和函数范围有贡献,你应该使用较新的const和{ {1}}关键字。

我建议您使用let作为默认关键字,并仅在您选择允许重新分配的情况下将其升级为const

答案 1 :(得分:2)

var不同,let是ES2015规范。 TCL documentation说:

  

在同一函数或块范围内重新声明相同的变量会引发SyntaxError。

这是为了改进对香草var的范围界定。

答案 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 中,但这些声明   集体只定义一个变量

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

过去 Javascript代码库以前没有太大而无法解决编程错误,最有可能的重点是确保而不是报告re的错误 - 变量JS引擎的声明应该处理它