(提到的var特指var或function这些老语法,let特指let/const新语法)
let与const的区别
let声明的变量值可以改变 const声明的变量值不可改变
主要原因: let声明的变量指针可以改变,也就是在值创建完成后 (先创建值->创建变量->值指向变量)用let声明的变量即使已经被赋值还是可以修改它指针的指向,改变当前变量代表的值 而const声明的变量,声明的时候必须赋值,指针指向当前值后不可改变,一旦改变就会报错
let与var的区别
var会变量提升
老语法中的var和function在词法解析之后的变量提升阶段(var会只声明,function是既声明也会赋值),而let或const这种新语法不会变量提升,如果在当前作用域用let声明了一个变量,不可以在声明前使用,这样会报错
var可重复声明let不可以
用var可以声明声明过的变量 用let不可以声明声明过的变量,所有用let声明的变量在当前作用域下只能声明一次
let会形成块级作用域
在一个块内可以是if(1===1){}可以是for(let i=0;i<10;i++){}或者只是{}
只要内部有let或者const就会形成一个私有块级作用域
var声明的全局变量会挂载到window上
如果在全局上用var/funtion声明了一个变量,会在变量提升阶段就挂载到window上
let会解决暂时性死区问题
暂时性死区是浏览器的bug,typeof一个没用声明的变量不但不报错还会得到结果是 "undefined",如果在typeof之后用let定义这个变量就会报错,解决浏览器这个bug
//正常情况下=>浏览器的bug
console.log(typeof n) //undefined
//变量没声明应该报错
//let声明解决暂时性死区问题
console.log(typeof n)
let n
//词法解析时报错,不可再let声明前使用函数