ES6只有六种声明变量的方法:var
命令和function
命令,let
和const
命令,import
命令和class
命令。所以,ES6一共有6种声明变量的方法。
const
声明一个只读的常量。一旦声明,常量的值就不能改变。
const
声明的变量不得改变值,所以const一旦声明变量,就必须立即初始化,不能留到以后赋值
在ES6中let
命令,用来声明变量。用法类似于var
,但是所声明的变量,只在let
命令所在的代码块内有效。
{ let a = 10; var b = 1;}a // ReferenceError: a is not defined.b // 1
let不存在变量提升。let
不像var
那样会发生“变量提升”现象。所以,变量一定要在声明后使用,否则报错。
console.log(test1); // 输出undefinedconsole.log(test2); // 报错ReferenceErrorvar test1= 2;let test2= 2;
暂时性死区。只要块级作用域内存在let
命令,它所声明的变量就“绑定”(binding)这个区域,不再受外部的影响。
var tmp = 123;if (true) { tmp = 'qq'; // ReferenceError 在let声明变量前,对tmp赋值会报错 let tmp;}
ES6明确规定,如果区块中存在let和const命令,这个区块对这些命令声明的变量,从一开始就形成了封闭作用域。凡是在声明之前就使用这些变量,就会报错。
if (true) { // TDZ开始 tmp = 'abc'; // ReferenceError console.log(tmp); // ReferenceError let tmp; // TDZ结束 console.log(tmp); // undefined tmp = 123; console.log(tmp); // 123}