从var-到-letJS-用了整整18年

22次阅读

共计 1342 个字符,预计需要花费 4 分钟才能阅读完成。

一个人的成功,不仅要靠个人的努力,还要考虑到历史的进程。

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 开发者,会感到心累,因为,在旧版本还需要继续维护, 不能够果断放弃,我想说,前人栽树,后人呵护。

正文完
 0