用法相似var,表示常量,只在let命令所在代码块内有效。es6
const声明只读常量。一旦声明常量的志不能变。一旦声明,必须当即赋初始值,不能留到之后赋值。bash
const foo = {};
// 为 foo 添加一个属性,能够成功
foo.prop = 123;
foo.prop // 123
// 将 foo 指向另外一个对象,就会报错
foo = {}; // TypeError: "foo" is read-only
复制代码
变量提高:var命令会发生“变量提高”现象,即变量能够在声明以前使用,值为undefined函数
// var 的状况
console.log(foo); // 输出undefined
var foo = 2;
// let或const 的状况
console.log(bar1); // 报错ReferenceError
console.log(bar2)
let bar1 = 2;
const bar2 = 3;
复制代码
只要块级做用域内,存在let或const命令,它所声明的变量就绑定这个区域,再也不受外部的影响。ui
var tmp = 123;
if (true) {
tmp = 'abc'; // ReferenceError
let tmp;
}
复制代码
在代码块内,使用let或const命令声明变量以前,该变量都是不可用的。这在语法上,称为“暂时性死区”。spa
ES6 规定暂时性死区和let、const语句不出现变量提高,主要是为了减小运行时错误,防止在变量声明前就使用这个变量,从而致使意料以外的行为。code
let和const不容许在相同做用域内重复声明一个变量。对象
// 报错
function func() {
let a = 10;
var a = 1;
}
// 报错
function func() {
var a = 10;
let a = 1;
}
// 报错
function func(){
let a = 10;
let a = 1;
}
// 不报错
function func(){
var a = 10;
var a = 1;
}
复制代码
1.外层代码块不受内层代码块影响,外层做用域没法读取内层做用域的变量,内层做用域能够定义外层做用域的同名变量而不受影响。内存
// ES6
function foo(){
let a = 0;
if(true){
let a = 1;
}
console.log(a); // 0
}
// ES5
function foo(){
var a = 0;
if(true){
var a = 1;
}
console.log(a); // 1
}
复制代码
2.循环变量不会泄漏为全局变量作用域
// ES6
let s = 'hello';
for(let i = 0;i<s.length;i++){
console.log(s[i]);
}
console.log(i); // 报错, i is not defined
// ES5
var s = 'hello';
for(var i = 0;i<s.length;i++){
console.log(s[i]);
}
console.log(i); // 5
复制代码
3.函数执行更简洁get
// ES6
{
...;
}
// 匿名当即执行函数表达式
(function(){
...;
}());
复制代码
摘自阮一峰