---------------let--------------------
能向下兼容
let跟var 的相同点
1.var有的let都有
1 console.log(a) //undefined 2 var a=1;//提升变量声明 3 console.log(b) //报错 4 let b=2;//不存在变量提升
----------let特点----------------
变量只允许声明一次/不能重复声明
如果var 声明了一次,let再声明就报错
var a=1; let a=2;//报错 //这里是暂时性死区 TDZ let a =1 { //块作用域里的a自动绑定当前作用域,为当前作用域的a,所以报错. console.log(a)//报错.因为let 只在声明时存在,不存在var提升变量 let a=2; console.log(a) }
---------------------------
let 声明的全局变量不再跟顶层对象挂钩
var a=1;//window.a输出为1; let b=2;//window.b输出为und,真的全局 function fn(arg){ //形参相当于var arg; { let arg=2; } }
-------------块作用域------------------
说到let,就不得不说一下块作用域
块作用域是独立的,自执行,没有返回值,可以拿到父级的参数.
如果块作用域里有var,那么var 的这个参数相当于声明在全局,
除json,function外,带{ }的语句有let/const都是块作用域
{ //块作用域 let a = 1 } console.log(a) //报错 do{ //拿到块作用最后的一条语句(试用而已) }
重点来了:比方说for循环,用let时,每次循环的结果都是独立的块作用域.
而用var的话,结果每次都是10,不独立.
let arr =[] for(let i=0;i<10;i++){ arr[i]=function(){ console.log(i) } } arr[1]()//1 arr[2]()//2
但是如下的话,for()里的内容相当于一个隐藏的作用域(相当于赋值i,跟var一样),相当于{}内容的父级,所以引用的是全局的i
let arr =[] let i; for(i=0;i<10;i++){ arr[i]=function(){ console.log(i) } } arr[1]()//10
总的来说,for的括号里如果是有let就是单独的一个作用域(括号里独立),var会泄漏到全局,所以相当于在全局声明了一个变量.
----------const---------------
用来声明常量的,只允许赋值一次,不能改变
let所有特性,const都有
let和const的区别有两点
1.const声明变量必须立即初始化值,不能留到后面
2.一旦变量声明就不可修改
本质:保存是对象的内存指针
const a=[1];//相当于家 a[0]=2//可以拓展,相遇于装修 console.log(a);//[2]; const b={} b.c=1; console.log(b)//{c:1};