一个人的成功啊,不仅要靠个人的努力,还要考虑到历史的进程。
18年?
看第一版的ECMA:1997年

看看支持let的版本:2015年

很难想象,只是一个语言特性的改版,竟然会用18年的时间,所以啊,一个人的成功,不仅要靠个人的努力,还要考虑到历史的进程,对于一门语言同样的适用。 很多人吐槽JS的很多缺陷,我觉得这不能怪 布兰登·艾克,因为一开始,就没想着JS能够做多大的事儿,就是一门简单的脚本语言,能够实现一些简单功能就可以了。后来互联网的日益繁荣,web的重视,才使得JavScript被委以重任,这也就要求JavaScript 变得越来越正式化,越来越是一门正真的编程语言。
从var说起
声明前置
var 用于声明一个变量,但是你需要注意到一些这种变量声明的奇怪特性,就是 声明前置。

上面的代码中,第一行使用了变量 a,在c语言中,还没声明一个变量就使用,是会直接报错的,但在JS中不会,而是会输出 undefined
这就是声明前置。上面的代码,相当于:

作用域
在ES6之前,你要知道,只有全局作用域和函数作用域。
在函数里面声明一个变量,在函数外部访问会报错:

如果像c语言一样写写块级作用域呢:

小结:var存在缺陷,声明前置,作用域的问题,不像一个编程语言该有的变量声明。
let的魔法
1. 暂时性死区
先使用,后定义会报错,不会再像var 那样随意:

这是不是就说明了let 声明的变量不会被前置呢?很多人认为let不会被提升,实际上不是这样的,再看一个例子:

let声明的变量必须先声明并初始化成功后才能被引用,否则,这个变量就不能被引用,进入了暂存死区,就跟死了一样。
2. 块级作用域

不会再像 var一样,let声明的变量是有自己独立的作用域的。

所以, let声明的变量只在自己的代码块中有效,即let声明的变量就是局部变量。
3. 重复声明
重复声明:

在块中重复声明:

在两个块中分别声明:

重新赋值:

所以,当在同一个作用域内,使用let重复声明,是会报错的,但是可以被重新赋值。
4. 不会作为window 的属性
var 声明的全局变量:

let 声明的全局变量:

const 声明一个量
const这也是ES6新增的语法,它是用于声明一个常量的,这个常量的值不可被修改。
声明一个常量

使用const 时必须要同时指定这个常量的值,否则会报错。

const的作用域

const声明的常量的作用域也是块级作用域,和let一样。
const 的值不可被修改
const声明创建一个值的只读引用。但这并不意味着它所持有的值是不可变的,只是变量标识符不能重新分配。
- 对于简单数据类型,值就保存在变量指向的那个内存地址。
- 对于复合类型的数据,变量指向的内存地址,时这个地址不可被修改,至于指向的实际的数据,是可以被修改的。

总结
let 总结
let声明的变量存在暂时性死区,创建过程存在提升,初始化过程不会被提升。let声明的变量具有块级作用域let声明的变量不允许重复声明let声明的变量不会作为window的属性
const 总结
- 声明时必须要初始化一个值
- 常量值不可更改
- 其他和
let特性一样
JS这门语言的发展是顺应历史的发展,只是JS开发者,会感到心累,因为,在旧版本还需要继续维护,不能够果断放弃,我想说,前人栽树,后人呵护。