let 命令
let 是在自身所在的代码块内有效。
因此 for 循环计数器就很适合用 let 声明。
用法:
{
let a = 0;
a //0
}
a //报错
特点:
- 它不允许在相同作用域内,重复声明同一个变量,在函数内部对同一个变量重复声明会报错。
// 报错
function func() {
let a = 10;
var a = 1;
}
// 报错
function func() {
let a = 10;
let a = 1;
}
- 它不存在变量提升,先使用后声明会报错。
// var 的情况
console.log(foo); // 输出undefined
var foo = 2;
// let 的情况
console.log(bar); // 报错
let bar = 2;
- 暂时性死区,只要块级作用域内存在let命令,它所声明的变量就绑定这个区域,不再受外部的影响。
var tmp = 123;
if (true) {
tmp = 'abc'; // 报错
let tmp;
}
const 命令
const 是声明一个只读变量,声明后不允许改变。
并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。
一旦声明必须初始化,否则会报错。
用法:
const PI = 3.1415;
PI // 3.1415
PI = 3; //报错
特点:
-
const声明的变量不得改变值。
-
一旦声明变量,就必须立即初始化,不能留到以后赋值,只声明不赋值会报错。
const foo;
// SyntaxError: Missing initializer in const declaration
- 与 let 一样不允许在相同作用域内,重复声明同一个变量。
var message = "Hello!";
let age = 25;
// 以下两行都会报错
const message = "Goodbye!";
const age = 30;
- 暂时性死区,ES6有明确规定,代码块内如果存在 let 或者 const,代码块会对这些命令声明的变量从块的开始就形成一个封闭作用域。代码块内,在声明变量之前使用它会报错。
if (true) {
console.log(MAX); //报错
const MAX = 5;
}