从var 到 let,JS 用了整整18年!

一我的的成功啊,不只要靠我的的努力,还要考虑到历史的进程。web

18年?

看初版的ECMA:1997年编程

看看支持let的版本:2015年编程语言

很难想象,只是一个语言特性的改版,居然会用18年的时间,因此啊,一我的的成功,不只要靠我的的努力,还要考虑到历史的进程,对于一门语言一样的适用。 不少人吐槽JS的不少缺陷,我以为这不能怪 布兰登·艾克,由于一开始,就没想着JS可以作多大的事儿,就是一门简单的脚本语言,可以实现一些简单功能就能够了。后来互联网的日益繁荣,web的重视,才使得JavScript被委以重任,这也就要求JavaScript 变得愈来愈正式化,愈来愈是一门正真的编程语言。函数

从var提及

声明前置

var 用于声明一个变量,可是你须要注意到一些这种变量声明的奇怪特性,就是 声明前置3d

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

做用域

在ES6以前,你要知道,只有全局做用域和函数做用域cdn

在函数里面声明一个变量,在函数外部访问会报错:blog

若是像c语言同样写写块级做用域呢:进程

小结:var存在缺陷,声明前置,做用域的问题,不像一个编程语言该有的变量声明。ip

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

相关文章
相关标签/搜索