var let的区别,以及let创建的全局变量window不能使用的问题

277 阅读1分钟

let、var的区别

  1. var存在变量提升,let没有变量提升
  2. let定义的变量不能在定义之前使用(形成暂时性死区),而var不会
  3. let声明形成块级作用域,而var不会形成作用域
  4. 同一作用域下let不能重复声明,而var可以
  5. 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访问不到, 直接访问即可