let、var的区别
- var存在变量提升,let没有变量提升
- let定义的变量不能在定义之前使用(形成暂时性死区),而var不会
- let声明形成块级作用域,而var不会形成作用域
- 同一作用域下let不能重复声明,而var可以
- let声明的全局变量不会挂载到window上,而是形成了一个块级作用域,var声明的变量会挂载在window上
let以及var创建的全局变量在哪呢
ES5中 var,function创建的全局变量会直接挂载到window身上,所以我们可以直接调用
var a = 20
function fn() { }
console.log(window.a) // 20
console.log(window.fn) // fn(){}
ES6 为了改变这一点,一方面规定,为了保持兼容性,var命令和function命令声明的全局变量,依旧是顶层对象的属性;另一方面规定,let命令声明的全局变量,不属于顶层对象的属性。也就是说,从 ES6 开始,全局变量将逐步与顶层对象的属性脱钩。
let a = 20
console.log(window.a) // undefined
console.log(a) // 通过块级作用域得到 20
由于let创建的全局变量会从window中脱离,在script中形成了一个块级作用域,所以通过window访问不到, 直接访问即可