0%

JS 有三宝——var、let、const

var

最早,JavaScript 是使用var来声明变量的,但是由于设计得并不合理,后来在 ES6 版本推出了letconst

var 的作用域是全局函数作用域,而作用域指的是变量能够作用的范围。所以,全局作用域指的就是变量伴随了整个程序的生命周期;而函数作用域指的是在函数体内定义,可以在该函数内的任意地方使用。

什么是全局作用域?在 App 开发中,一个 App 就是一个进程,那么全局作用域就是在这个应用内部都可以访问到该变量,并且它一直在执行环境中,不会被释放。而浏览器中,就得把一个页面看做是一个全局,所以,全局变量的生命周期和这个页面的生命周期是一样的。

可是,使用var声明变量有很大的弊端。「它会使变量提升」,即「在代码执行之前,JavaScript 引擎把变量和函数的声明部分提升到对应作用域的开始位置」。如果变量提升后,var声明的变量的初始值就是undefined

1
2
3
4
5
6
7
call();

function call() {
// name 被提升
console.log(name);
var name = '三宝';
}

let

为此,在 ES6 中,提出了let这个声明变量的方式,使用let声明的变量是块级作用域。即用let声明的变量只能在这个块内部使用,而同一变量是不可以重复声明的。不过,如果是在不同的作用域中,即跳出了这个块,那么是可以重复定义的。

什么是块呢?只要有两个大括号就属于一个域。块就是两个大括号包起来的内容。

1
2
3
4
5
6
7
8
9
for(let i = 0; i < 2; i++) {
// 代码块
}
if (true) {
// 代码块
}
function call() {
// 代码块
}

对于使用let声明的变量,如果在未声明时就使用,那么会报错Cannot access XXX before initialization

const

但是有时候我们声明一个变量之后,一旦赋值了就不需要再更改了,那么我们就可以用const,即声明常量最常用的手段。所以,在日常开发中,能要用const就要用const,它能够保证程序的状态更加稳定。在别的方面,const都与let类似,不同之处就在于它的不变性,且使用const声明的变量在声明时,就一定要设定初始值。

总结

  1. var声明的变量的作用域是全局或者函数级别的,而letconst声明的变量是块级的,一个{}表示一个代码块。
  2. var声明的变量可以更新,可以重新声明;let声明的变量可以更新,但是不能重新声明;const声明的变量既不能重新更新也不能重新声明;
  3. varlet声明的变量可以不初始化,但是const声明的变量必须初始化;
  4. 其实,varletconst声明的变量都会发生变量提升(即先使用后定义),var如果这样会被初始化为undefined,而letconst声明的变量则不会被初始化,会直接报错。

参考文献