一、let命令
1)let的作用域只在代码块内,块外无效;var全局有效
var a = [];
for(var i = 0;i < 10;i++){
a[i] = function(){
console.log(i);
};
}
a[6]();
对于这段代码,变量i是var声明的,在全局范围内有效,所以每一次循环,新的i值都会覆盖旧值,导致最后输出的是最后一轮的i值
如果使用let,声明的变量仅在块级作用域内有效,即只在本轮有效,所以每一次的循环其实都是一个新的变量,最后将输出6
2)let不像var会有变量提升,所以变量一定要在声明后使用,否则报错
3)暂时性死区:
只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不在受外部的影响。
var tmp = 123;
if(true){
tmp = 'abc'; //referenceError
let tmp;
}
这段代码中存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定这个块级作用域,所以在let声明变量前,对tmp赋值会报错。
ES6明确规定,如果区块中存在let和const命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域。只要在声明之前就使用这些变量,就会报错。(暂时性死区)
暂时性死区的本质就是:只要一进入当前作用域,所要使用的变量就已经存在,但是不可以获取,只有等到声明变量的哪一行代码出现,才可以获取和使用该变量。
4)不允许重复声明,否则报错
5)ES6允许块级作用域任意嵌套
内层作用域可以定义外层作用域的同名变量
块级作用域外部无法调用块级作用域内部定义的函数
二、const
const用来声明常量,一旦声明,其值就不可以更改
const一旦声明常量,就必须立即初始化
const的作用域和let命令相同:只在声明所在的块级作用域内有效
const命令声明的常量也不提升,同样存在暂时性死区,只能在声明后使用
ES5只有两种声明变量的方法:var命令和function命令
ES6除了添加let和const之外,还添加了import和class命令,共有6中声明变量的方法