let作用域问题

Posted longlongdan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了let作用域问题相关的知识,希望对你有一定的参考价值。

  1. 在使用let定义变量时遇见这样一个错误
     1 async addPageVersion(uuid, param) 
     2          let result = await this.getVersions(uuid, pageData: param.pageData);
     3          if(result&&result.length) 
     4              //更新时间
     5              let result = await to(Pageversion.findOneAndUpdate(uuid,pageData: param.pageData, updateTime: param.updateTime));
     6          else
     7              //添加
     8              let res = await this.getVersions(uuid);
     9 
    10           let  uuid, lastAuthor, pageData, updateTime, imgUrl  = param;
    11              let pageVersion = new Pageversion(uuid,lastAuthor, pageData,updateTime, imgUrl);
    12              result = await to(pageVersion.save());
    13          
    14      

     

    if里面可以获取到参数uuid,但是在else里面我们的参数uuid会为undefine??

  2. let定义的变量会有块级作用域,第12行定义的let会覆盖掉传入的参数uuid。
  3. 但是还有一个问题,为什么uuid会是undifined而不是报错呢?
  4. 原因其实是因为我们的代码并不是直接执行的,而是通过编译工具执行。区别在于编译之后的代码会存在作用域提升。相当于代码变成了下面的写法(参考:https://segmentfault.com/q/1010000018839614)
    function a(uuid) 
       if(..) 
        ...
         else 
         let uuid;
         console.log(uuid);
         uuid = ??;  
       
    

 

以上是关于let作用域问题的主要内容,如果未能解决你的问题,请参考以下文章

let作用域问题

var与let区别-详解块级作用域与局部作用域

var与let区别-详解块级作用域与局部作用域

块级作用域

关于 ES6 的 let ,var和 const

ES6块级作用域及新变量声明(let)