总结来自于阮一峰老师
一. let 和 const
1.let
ES6 新增了let
命令,用来声明变量。它的用法类似于var
,但是所声明的变量,只在let
命令所在的代码块内有效。
1.有块级作用域( if for 等 {} 算作代码块)
{ let a = 10; var b = 1; } console.log(a); // 报错 console.log(b); //1但是 如果在{}里面打印a 就会返回正确的值;
这就说明,
let
声明的变量只在它所在的代码块有效。
2.不存在变量提升,有暂时性死区
//var命令会发生“变量提升”现象,即变量可以在声明之前使用,值为undefined。 // var 的情况 console.log(foo); // 输出undefined var foo = 2; //变量bar用let命令声明,不会发生变量提升。这表示在声明它之前,变量bar是不存在的,这时如果用到它,就会抛出一个错误。 // let 的情况 console.log(bar); // 报错 let bar = 2;
//只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不再受外部的影响。 var tmp = 123; if (true) { tmp = 'abc'; // 报错 let tmp; } 在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”
3.不能重复声明
// 报错 function func() { let a = 10; var a = 1; } // 报错 function func() { let a = 10; let a = 1; }function func(arg) { let arg; } func() // 报错 function func(arg) { { let arg; } } func() // 不报错
4.声明不会挂在到window上
let命令、const命令、class命令声明的全局变量,不属于顶层对象的属性。
2.const
1.有块级作用域 (if for 等 {} 算作代码块)
2.不存在变量提升,有暂时性死区
3.常量不能修改
const声明一个只读的常量。一旦声明,常量的值就不能改变。 const a = 3.1415; // a = 3; // 报错 console.log(a); // 3.1415 //上面代码表明改变常量的值会报错。
4.声明不会挂在到window上