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

Javascript 为什么var允许重复声明,而const和let不允许重复声明? 为什么var允许重复声明,而const和let不允许重复声明?,javascript,angular,typescript,variables,var,Javascript,Angular,Typescript,Variables,Var,var允许重复声明 xx=1; xx=2; 控制台日志(xx+xx)//4. var xx=1; var-xx=2; 控制台日志(xx+xx)//4. var 在2016年之前,var关键字是定义变量的唯一方法* 无论您在何处编写var x,变量x都被视为是在封闭范围的顶部声明的(变量var的范围是“一个函数”) 同一范围内变量的所有声明实际上都在谈论同一个变量 这里有一个例子。。。您可能认为在函数中,我们用fenton覆盖外部name,并将fenton添加到内部变量中 var name =

var
允许重复声明

xx=1;
xx=2;
控制台日志(xx+xx)//4.
var xx=1;
var-xx=2;
控制台日志(xx+xx)//4.
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的作用域,假设您想知道此行为是否符合规范,请检查此项

在任何VariableEnvironment的范围内都有一个公共BindingIdentifier 可能出现在多个VariableDeclaration中,但这些声明 集合仅定义一个变量

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

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

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

c#或java(例如)处理重复变量名的方式、名称冲突返回编译错误的方式以及它在js等解释语言中的工作方式有很大的不同。请检查下面的代码段:
i
的值没有重复?实际上,在函数和块上下文中,相同的变量名被称为两个不同的变量,具体取决于它们的声明位置

函数checkletreplication(){
设i='函数范围';
for(设i=0;i<3;i++)
{
log('(对于语句范围):在for循环i中,等于:',i);
}
log(“(“CheckletReplication”函数作用域):在for循环i之外,等于:”,i);
}

checkletreplication()为什么?为什么
let
不允许重新声明?或者为什么
var
会这样做?因为
const
做它的名字所说的,它是常量。你在寻找什么样的答案?让它是范围敏感的,var不是。我认为这个选择是为了迫使js用户不要陷入糟糕的实践中。var是一个古老的东西。let和const的引入使得JS代码更加严格,意外行为更少。如果你试图重新申报,这不是正常的行为。要么选择其他标识符,要么更改值(如果不是常量)。或者将代码拆分为两个函数,因为这一个函数中的代码行太多。这有助于思考您自己的代码。这么长的解释。我期待着对这个答案给予赏金:)-