在函数作用域或全局作用域中通过关键字var声明的变量,无论在哪里声明,都会被当成在当前作用域顶部声明的变量,这就是JavaScript的变量提升机制。我们看下面的代码:
![8139a21c34c5d7b23c557019a5ea9266.png](https://i-blog.csdnimg.cn/blog_migrate/8372841eafde6ecf1d3d33621554d5da.jpeg)
变量声明
这种变量提升机制在开发时会给我们造成很多的困扰,ECMAScript 6引入了let声明,用法与var相同,不过用let声明的变量不会被提升,可以把变量的作用域限制在当前代码块中。
我们将上述代码中的变量用let进行声明,如下所示:
![823a0439af53ff287b73c3834bd5d87a.png](https://i-blog.csdnimg.cn/blog_migrate/fde6b1a5b51c177da6af61204144cf85.jpeg)
let声明
使用let声明变量,还可以防止变量的重复声明。例如在某个作用域下已经存在某个标识符,此时再使用let关键字声明它,就会抛出错误,如下所示:
![8ec87898f43ac9b10dbe887931523aa3.png](https://i-blog.csdnimg.cn/blog_migrate/7300e2f5079528f1a2d0d36e36853bbf.jpeg)
重复声明变量
同一作用域下,不能使用let重复定义已经存在的标识符,但如果在不同的作用域下,则是可以的,这一点请读者注意,如下所示:
![d7b7c7cdc407b1bfaa85331b73cbb1eb.png](https://i-blog.csdnimg.cn/blog_migrate/e149999db8e065c682ca9fac733f9ff1.jpeg)
在不同的作用域下
ECMAScript 6还提供了const关键字,用于声明常量。每个通过const关键字声明的常量必须在声明的同时进行初始化,如下所示:
![0bc06fa209f74376f7fa749a9a7e7195.png](https://i-blog.csdnimg.cn/blog_migrate/525b214eeb482b983bbb78bdc850c715.jpeg)
const声明常量
与let类似,在同一作用域下用const声明已经存在的标识符也会导致语法错误,无论该标识符是使用var,还是let声明的。
如果使用const声明对象,对象本身的绑定不能修改,但对象的属性和值是可以修改的,我们看下面的代码:
![3574810bbca38d86d3cd207b5aa2d77a.png](https://i-blog.csdnimg.cn/blog_migrate/b27e8e7988aa4d5018e23117c15b30c7.jpeg)
用const声明对象