let和var的区别

ES6新增的let:

  • 不属于顶层对象window
  • 不允许重复声明
  • 不存在变量提升
  • 暂时性死区:先定义,后使用
  • 块级作用域

ES5中的var:

  • 属于顶层对象window
  • 允许重复声明,后面声明替换前面声明的值
  • 存在变量提升
  • 没有暂时性死区
  • 函数作用域
  for (var i = 0; i < 3; i++) {
     
            console.log(i); // 0 1 2
            console.log(this.i) // 0 1 2
        }
        console.log(i) // 3  var 属于window, for循环在i=3不符合条件退出for循环了
        for (let i = 0; i < 3; i++) {
     
            console.log(i); // 0 1 2
            console.log(this.i) // undefined let不属于window
        }
        console.log(i) // error  块级作用域
        for (var i = 0; i < 3; i++) {
     
            setTimeout(() => {
     
                console.log(i) // 一秒后 3 3 3
                console.log(this.i) // 一秒后 3 3 3
            })
        }
        console.log(i) // 立即出来 3
        for (let i = 0; i < 3; i++) {
     
            setTimeout(() => {
     
                console.log(i) // 一秒后 0 1 2
                console.log(this.i) // 一秒后undefined
            })
        }
        console.log(i) // 立即出来 error i not undefined
        for (let i = 0; i < 3; i++) {
     
            (function () {
     
                setTimeout(() => {
     
                    console.log(i) // 一秒后 0 1 2
                    console.log(this.i) // 一秒后 undefined
                }, 1000)
            })()
        }
        for (var i = 0; i < 3; i++) {
     
            (function () {
     
                setTimeout(() => {
     
                    console.log(i) // 一秒后  3 3 3
                    console.log(this.i) // 一秒后  3 3 3 
                }, 1000)
            })()
        }

敲一遍,理解理解

你可能感兴趣的:(ES6,javascript)