一我的的成功啊,不只要靠我的的努力,还要考虑到历史的进程。web
看初版的ECMA:1997年编程
看看支持let的版本:2015年编程语言
很难想象,只是一个语言特性的改版,居然会用18年的时间,因此啊,一我的的成功,不只要靠我的的努力,还要考虑到历史的进程,对于一门语言一样的适用。 不少人吐槽JS的不少缺陷,我以为这不能怪 布兰登·艾克,由于一开始,就没想着JS可以作多大的事儿,就是一门简单的脚本语言,可以实现一些简单功能就能够了。后来互联网的日益繁荣,web的重视,才使得JavScript被委以重任,这也就要求JavaScript 变得愈来愈正式化,愈来愈是一门正真的编程语言。函数
var
用于声明一个变量,可是你须要注意到一些这种变量声明的奇怪特性,就是 声明前置。3d
上面的代码中,第一行使用了变量 a
,在c语言中,还没声明一个变量就使用,是会直接报错的,但在JS
中不会,而是会输出 undefined
这就是声明前置。上面的代码,至关于:code
在ES6以前,你要知道,只有全局做用域和函数做用域。cdn
在函数里面声明一个变量,在函数外部访问会报错:blog
若是像c语言同样写写块级做用域呢:进程
小结:var
存在缺陷,声明前置,做用域的问题,不像一个编程语言该有的变量声明。ip
先使用,后定义会报错,不会再像var
那样随意:
这是否是就说明了let
声明的变量不会被前置呢?不少人认为let
不会被提高,实际上不是这样的,再看一个例子:
let
声明的变量必须先声明并初始化成功后才能被引用,不然,这个变量就不能被引用,进入了暂存死区,就跟死了同样。
不会再像 var
同样,let
声明的变量是有本身独立的做用域的。
因此, let
声明的变量只在本身的代码块中有效,即let
声明的变量就是局部变量。
重复声明:
在块中重复声明:
在两个块中分别声明:
从新赋值:
因此,当在同一个做用域内,使用let
重复声明,是会报错的,可是能够被从新赋值。
var
声明的全局变量:
let
声明的全局变量:
const
这也是ES6新增的语法,它是用于声明一个常量的,这个常量的值不可被修改。
声明一个常量
使用const
时必需要同时指定这个常量的值,不然会报错。
const的做用域
const
声明的常量的做用域也是块级做用域,和let
同样。
const 的值不可被修改
const
声明建立一个值的只读引用。但这并不意味着它所持有的值是不可变的,只是变量标识符不能从新分配。
let
声明的变量存在暂时性死区,建立过程存在提高,初始化过程不会被提高。let
声明的变量具备块级做用域let
声明的变量不容许重复声明let
声明的变量不会做为window
的属性let
特性同样JS这门语言的发展是顺应历史的发展,只是JS开发者,会感到心累,由于,在旧版本还须要继续维护,不可以果断放弃,我想说,前人栽树,后人呵护。