一、问题的提出
在学习js的过程中,很多小伙伴会理解变量的知识点。其实每个变量只是更好的表白数据的占位符。在ECMAScript中,有三个关键字能够申明变量:var,const和let。

然而为什么简简单单的申明变量还须要三个关键字呢?他们有什么异同呢?

二、呈现工夫的不同
通过查问材料咱们发现,let、const两个变量只能在ES6以及更晚的版本中应用,var在ES的所有版本中均可应用。集体了解为let和const两个变量是对于var毛病的补充。

三、三者区别
节约工夫,先说后果再说起因!!

var

全局作用域、函数作用域。

同一作用域下,能够屡次申明同一变量(能够在后续代码中从新赋值)。

能够在申明前调用(先调用后申明)。

let

作用域:全局作用域、函数作用域、块级作用域。

同一作用域下,不能够屡次申明同一变量。

不能够在申明前调用。

const

作用域:全局作用域、函数作用域、块级作用域。

同一作用域下,不能够屡次申明同一变量。

不能够在申明前调用。

由此可见

const 的行为与 let 基本相同,惟一一个重要的区别是用它申明变量时必须同时初始化变量,且
尝试批改 const 申明的变量会导致运行时谬误。而var只能用于全局作用域和函数作用域。
刚刚提到了一个名词叫块级作用域,指的范畴是:

循环
判断
同一级{ }外面的货色
上面咱们来详解一下这些关键字吧~~

四、详解关键字
var关键字
1.1 var关键字

此处是对于var的函数作用域的展现,在办法中申明的var变量,只对于该办法外部起到成果。

function Test() {  var a = "hi"; // 局部变量} test(); console.log(a); // 出错!

解决此类问题,能够抹去var变量,间接定义一个全局变量如下 ,不过个别不举荐这么做,会造成困惑,保护起来也麻烦。

function test() {  a = "hello world"; // 局部变量} test(); console.log(a); // "hello world" 1.2   var申明的晋升

这一条看起来就很诡异,在作用域内先输入变量,再定义的模式,在Js中不会报错,因为申明的变量会主动提到函数作用域顶部

举个例子:

function foo() {  console.log(score);  var score = 26; } foo(); // undefined这个代码中,先输入了score,之后才进行赋值 。

这里是因为在ES运行时,会主动把所有关键字var申明的变量放在顶部。然而此时未赋值。所以输入undefined。在解决的过程中,ES把上述代码等同于:

 var score;  console.log(score);  score = 26; } foo(); // undefined

这就是var的申明晋升

let关键字
1.let关键字的作用域

说到let,不可避免的肯定要提到块级作用域,前文中提到,能够近似的了解为对立对{ }外面的内容。

写个代码跑跑看吧

//首先咱们能够先写个var,比照一下if(true){    var name = "xiaotian"    console.log(name)  //"xiaotian"}    console.log(name)  //"xiaotian"//如果此时用的是let呢?if(true){    let name = "xiaotian"    console.log(name)  //"xiaotian"}console.log(name)  //ReferenceError.age没有定义

由此可见,let只在代码的作用域内起到作用。 而var能够在全局起到作用。值得注意的是,这里用到的是if语句,并非上文中提到的函数作用域function()。所以var定义的数值能够传出。

值得注意的是let和var不同的作用域,即函数嵌套应用,能够反复定义let和var。

2.申明范畴

var会成为windows对象的属性,然而let不会

3.条件

前文提到,var申明的变量能够被晋升,在顶部定义。但let只作用于块作用域,无奈查看是否曾经应用过let申明雷同变量。同样也不能在申明前被调用。

const关键词
这个关键字和let用法很类似 ,然而循环过程中有一种报错模式,此处时因为迭代变量会自增:

for (const i = 0; i < 10; ++i) {} // TypeError:给常量赋值

综上所述

var因为作用域太过于宽泛,容易在应用过程中呈现问题,let和const会好很多,也更易于定位谬误。