ES6学习笔记(一):let和const命令

ES6新增了letconst两个命令来声明变量,这两个新的命令和ES5中的var命令有很多不同之处,而且使用letconst会让代码看起来更严谨。

块级作用域

在ES5的时候,只有全局作用域和函数作用域,ES6新增了块级作用域的概念,看下面的代码

1
2
3
4
5
6
{
var a = 1;
let b = 1;
}
console.log(a); // 1
console.log(b); // ReferenceError: b is not defined

在上面的代码块之中,分别用varlet声明了变量ab,然后我们在代码块之外访问变量ab,结果用var声明的变量a能够访问到,而用let声明的变量b报错了。这表明,用let声明的变量只在它所在的代码块内有效。for循环中的计数器就非常适合用let来声明,用let声明的计数器i的作用域仅仅在循环体中,外部是没法访问到的,而用var声明的计数器j的作用域却是全局的,在任何地方都能访问,而这并不是我们想要的结果。

不存在变量提升(必须先声明后使用)

let声明的变量不会像var那样发生变量提升的现象,如果使用之前没有声明,就会报错。

1
2
3
4
console.log(a); // undefined
console.log(b); // ReferenceError: b is not defined
var a = 1;
let b = 1;

上面的代码中,a是用var命令声明的,会发生变量提升(相当于自动在代码的顶部添加了var a;这一句),即脚本运行的时候a其实就已经存在了,只不过没有赋值,所以输出undefined。而let声明的变量不会提升,所以在使用的时候如果发现还没有声明,就会报错。这样也能够让我们在写代码的时候更规范,变量必须先声明后使用。

暂时性死区

只要块级作用域中存在let命令,它所声明的变量就会绑定(binding)这一区域,不再受外部的影响。

1
2
3
4
5
let tmp = 1;
if(true) {
tmp = 2; // ReferenceError: tmp is not defined
let tmp; // 这个局部变量tmp会绑定所在的块级作用域,在此之前不能访问变量tmp
}

上面代码中,存在全局变量tmp,但是在块级作用域内let又声明了一个局部变量tmp,导致后者绑定了这一区域,所以在let声明tmp之前,对tmp进行赋值会报错

ES6明确规定,如果区块中存在letconst命令,这个区块对这些命令声明的变量从一开始就形成了一个封闭作用域,凡是在声明之前就使用这些变量,就会报错。总之,在代码块内使用letconst声明变量之前,这些变量都是不可用的。在语法上,这称为暂时性死区

不允许重复声明同一变量(在同一个块级作用域内)

letconst不允许在同一个作用域内重复声明同一变量。

1
2
3
4
5
6
7
8
9
10
11
function func() {
let a = 1;
var a = 2; // 报错
const b = 1;
const b = 2; // 报错
}
function func() {
let a = 1;
let a = 2; // 报错
}

因此,不能在函数内部重新声明参数

1
2
3
4
5
6
7
8
9
function func(a) {
let a = 5; // 报错
}
function func(a) {
{
let a = 5; // 不报错,不在同一作用域内
}
}

const声明的常量不允许修改

ES6新增了const命令,用来声明一个常量,既然是常量,就意味着一旦声明之后,变量的值就不能修改

1
2
3
const PI = 3.1415;
console.log(PI); // 3.1415
PI = 3; // 报错,常量的值不能修改

既然const声明的常量不允许修改值,那就意味着,一旦声明就必须立即初始化,不能留到后面再赋值

1
2
const PI; // 报错,必须赋值
const MAX = 5;

参考链接:
ECMAScript 6 入门(阮一峰):let和const命令

坚持原创技术分享,您的支持将鼓励我继续创作!