let命令

作者: Allan要做活神仙 | 来源:发表于2017-05-17 18:06 被阅读11次

    与var命令的对比,以及let的一些特性
    1.let声明的变量只能在let命令所在代码区块中生效

    // var
    for(var i = 0; i < 5; i++){
    }
    console.log(i) // 5
    // let
    for(let i = 0; i < 5; i++){      // 这个i只能在这个for循环内使用
    }
    console.log(i) // 报错:i is not defined
    

    2.let不存在变量提升

    console.log(a)   // undefined
    console.log(b)   // 报错:b未定义
    var a = 1
    let b = 1
    

    3.因为let不存在变量提升,所以会有暂时性死区
    什么是暂时性死区?
    暂时性死区就是在这个区块中的变量未声明之前,对该区块中的变量的一切调用都会报错

    a = 1
    let a = 2  
    // 以上代码会报错
    a = 1
    {let a = 2}
    // 以上代码不会报错,因为声明变量的区块不一
    

    4.let声明的变量不能重复进行声明

    let a = 1
    var a = 1 // 报错 a已经被声明
    const a = 1 // 报错 a已经被声明
    

    let的使用实例
    因为let命令的出现,所以JS有了块级作用域,原本因为作用域问题导致的闭包问题也可以使用let吗,清零进行解决,比如以下经典闭包代码会一次性输出5个5,但需求是输出01234

    for(var i = 0; i < 5; i++){
      setTimeout(function(){
          console.log(i)
      }, 1000)
    }
    

    1.ES6之前的解决办法,使用一个变量对 i 的值进行暂存

    for(var i = 0; i < 5; i++){
      (function(e){
          setTimeout(function(){
              console.log(e)
          }, 1000)        
      })(i)
    }
    

    2.出现let后的解决办法

    for(let i = 0; i < 5; i++){
      setTimeout(function(){
          console.log(i)
      }, 1000)
    }
    

    关于for循环作用域的问题
    在for循环中实际上是有两个作用域的,条件设置的圆括号()内是一个父作用域,而代码块大括号{}中是一个子作用域,比如下面代码可以进行区分

    for(let i = 0; i < 5; i++){
      let i = 8
      console.log(i)
    }
    // 输出结果是5个8
    

    来源:https://zhuanlan.zhihu.com/p/26951461

    相关文章

      网友评论

          本文标题:let命令

          本文链接:https://www.haomeiwen.com/subject/idadxxtx.html