【问题标题】:Why does var allow duplicate declaration but why does const and let not allow duplicate declaration?为什么 var 允许重复声明,但为什么 const 和 let 不允许重复声明?
【发布时间】:2018-08-15 07:52:35
【问题描述】:

为什么 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 中看到了一些类似的东西,

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

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

【问题讨论】:

  • 为什么什么?为什么let 不允许重新声明?或者为什么var 会这样做?
  • 因为const 就像它的名字所说的那样,它是不变的。
  • 你在寻找什么样的答案?
  • 让范围敏感,var 不是。我认为这个选择是为了迫使 js 用户不要陷入不良习惯。
  • var 是一个古老的东西。引入了 let 和 const ,因此 JS 代码更严格,意外行为更少。如果您尝试重新声明它,这不是正常行为。要么选择其他标识符,要么更改值(如果它不是 const)。或者你把你的代码分成两个函数,因为你在这个函数中有太多的代码行。它有助于思考你自己的代码。

标签: javascript angular typescript variables var


【解决方案1】:

变量

直到 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

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

【讨论】:

  • 这么长的解释。我期待着给这个答案一个赏金:) –
【解决方案2】:

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

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

这是为了改进原版var 的范围。

【讨论】:

    【解决方案3】:

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

    c# 或 java(例如)如何处理重复变量名(其中名称冲突会返回编译错误)与它在 js 等解释型语言中的工作方式之间存在很大差异。请检查下面的 sn-p: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();

    【讨论】:

      【解决方案4】:

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

      在任何 VariableEnvironment 的范围内都有一个通用的 BindingIdentifier 可能出现在多个变量声明中,但那些声明 集体只定义一个变量

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-02
        • 2018-06-20
        • 2020-10-20
        • 2020-08-10
        • 2018-01-04
        • 2015-02-20
        • 1970-01-01
        相关资源
        最近更新 更多