var
最早,JavaScript 是使用var
来声明变量的,但是由于设计得并不合理,后来在 ES6 版本推出了let
和const
。
var 的作用域是全局和函数作用域,而作用域指的是变量能够作用的范围。所以,全局作用域指的就是变量伴随了整个程序的生命周期;而函数作用域指的是在函数体内定义,可以在该函数内的任意地方使用。
什么是全局作用域?在 App 开发中,一个 App 就是一个进程,那么全局作用域就是在这个应用内部都可以访问到该变量,并且它一直在执行环境中,不会被释放。而浏览器中,就得把一个页面看做是一个全局,所以,全局变量的生命周期和这个页面的生命周期是一样的。
可是,使用var
声明变量有很大的弊端。「它会使变量提升」,即「在代码执行之前,JavaScript 引擎把变量和函数的声明部分提升到对应作用域的开始位置」。如果变量提升后,var
声明的变量的初始值就是undefined
。
1 | call(); |
let
为此,在 ES6 中,提出了let
这个声明变量的方式,使用let
声明的变量是块级作用域。即用let
声明的变量只能在这个块内部使用,而同一变量是不可以重复声明的。不过,如果是在不同的作用域中,即跳出了这个块,那么是可以重复定义的。
什么是块呢?只要有两个大括号就属于一个域。块就是两个大括号包起来的内容。
1 | for(let i = 0; i < 2; i++) { |
对于使用let
声明的变量,如果在未声明时就使用,那么会报错Cannot access
XXX before initialization
。
const
但是有时候我们声明一个变量之后,一旦赋值了就不需要再更改了,那么我们就可以用const
,即声明常量最常用的手段。所以,在日常开发中,能要用const
就要用const
,它能够保证程序的状态更加稳定。在别的方面,const
都与let
类似,不同之处就在于它的不变性,且使用const
声明的变量在声明时,就一定要设定初始值。
总结
var
声明的变量的作用域是全局或者函数级别的,而let
和const
声明的变量是块级的,一个{}
表示一个代码块。var
声明的变量可以更新,可以重新声明;let
声明的变量可以更新,但是不能重新声明;const
声明的变量既不能重新更新也不能重新声明;var
和let
声明的变量可以不初始化,但是const
声明的变量必须初始化;- 其实,
var
、let
、const
声明的变量都会发生变量提升(即先使用后定义),var
如果这样会被初始化为undefined
,而let
和const
声明的变量则不会被初始化,会直接报错。