let,const是es6种新增的关键字;
let的特点:
- let声明的变量只在let所在的代码块有效
- let没有变量提升功能,所以作用域只在所声明的代码块中,在该代码外之外都访问不到
- let变量只能声明一次,不能重复声明(同一个作用域下)
{ let a=1; console.log(a);//1 } console.log(a);//Uncaught ReferenceError: a is not defined,报错不会继续往下执行 let a=2; console.log(a);
let a=2; console.log(a);//2 { let a=1; console.log(a);//1 } console.log(a);//2
var的特点:
- var可以重复声明变量
- var有变量提升的租用,所以声明变量是全局作用域,但js种函数是可以控制var声明的变量是局部作用域
{ var a=1; console.log(a);//1 } console.log(a);//1 var a=2; console.log(a);//2
const的特点:
- const是声明一个只读的常量,一旦声明,常量的值就不能改变
- 一旦声明必须赋值,否则会报错
const PI=3.1415926; console.log(PI)//3.1415926 console.log('==================') const PI2; console.log(PI2)//Uncaught SyntaxError: Missing initializer in const declaration //一旦声明必须初始化,否则报错 const obj={a:1}; obj.a=2; console.log(obj)//{a:2} //此时obj是个对象,obj存储的是对象的地址,地址没有改变,所以此时不会报错 obj=function(){ return 2; } console.log(obj)//报错 //把一个对象重新赋值给了obj,此时改变了对象的指针指向
let 和const都有封闭性死区的特性:
let a=123;//代码块外定义了一个变量a if(true){ console.log(a);//报错Uncaught ReferenceError: a is not defined let a=111;//代码块内定义了一个变量a, console.log(a);//111 }
var A=1; if(A>0){ console.log(A);//A is not defined; const A=666; }
es6明确规定:代码内如果存在let或者const,代码块会对这些命令声明的变量会从代码块的开始就形成一个封闭的作用域。代码块内,在声明变量a/A之前使用它就会报错。
备注:从{开始,到}结束,代码形成一个封闭的区域,不管代码块外边是否用let/const对当前变量进行了定义,代码块中的变量都不受影响。因为不在同一个作用域下,如果是同一个作用域,变量是不能重复声明的。