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代码更加严格,意外行为更少。如果你试图重新申报,这不是正常的行为。要么选择其他标识符,要么更改值(如果不是常量)。或者将代码拆分为两个函数,因为这一个函数中的代码行太多。这有助于思考您自己的代码。这么长的解释。我期待着对这个答案给予赏金:)-