• 关于es6中let的相关问题


      之前通过babel-node将es6转为es5后结合生成的es5代码认为let是在es5的基础上封装的语法糖,并且通过babel-node执行没有报ReferenceError而认为其有变量提升,其实这是错误的,let是es中新加入的一个标识符而已。并且没有变量提升。特此勘正。

      1、let中没有变量提升。

      在通过babel-node执行es6的代码时,是将es6转换为es5后去执行的,所以下面的代码

      if (true) {
        // TDZ开始
        tmp = 'abc'; // ReferenceError
        console.log(tmp); // ReferenceError
    
        let tmp; // TDZ结束
        console.log(tmp); // undefined
    
        tmp = 123;
        console.log(tmp); // 123
      }
      转换为es5后的代码为
      if (true) {
        
          _tmp = 'abc'; //
          console.log(_tmp); // abc
    
          var _tmp = undefined; 
          console.log(_tmp); // undefined
    
          _tmp = 123;
          console.log(_tmp); // 123
      }

      并且输出的是undefined,而不是ReferenceError,但是在这里就不要认为let存在变量声明,babel-node在执行的过程中会将代码转为es5,

    但是在正式的es6环境下会输出ReferenceError,  和var声明的变量不一样,var 是当一个变量所在的函数被解析的时候,就为函数创建了一个

    函数作用域,变量也被初始化为undefined,然后当函数执行到该变量声明的地方的时候,就会对该对象进行初始化,如果没有赋值,那么该变量

    的值就是undefined。而let声明的变量存在TDZ(The temporal dead zone) 什么意思呢?当let所在的包含块被解析时,会创建一个块级作用

    域,但是此时变量是没有初始化,在该块级作用域中尝试在let声明之前获取它的值或者给它赋值都将会报ReferenceError的错误。当执行到let

    声明的变量的时候会对该变量进行初始化,如果没有赋值,那么该变量的值是undefined。在这里要感谢WhatTheFsck的指点。

      最后再小结一下let的知识吧
      1、let拥有块级作用域
      2、let在块级作用域中不存在变量提升
      3、不能在同一作用域中(函数作用域和块级作用域)用let声明相同的变量
     
     
      外文参考:  http://www.2ality.com/2015/02/es6-scoping.html

      

  • 相关阅读:
    GeneXus for SAP的最新动态
    GeneXus DevOps 自动化构建和部署流程
    GeneXus 16 如何实现自动化测试和发布
    在GeneXus开发过程中如何进行自动化测试?
    【GeneXus】在WorkWithPlus中如何定义未被包含的页面属性?
    【GeneXus】开发移动APP时,如何使用Canvas进行布局?
    如何对富文本编辑器(FCK Html Editor)的工具栏进行扩展?
    GenXus进行APP开发-全局颜色设计
    通过GeneXus如何快速构建微服务架构
    Android签名打包详解
  • 原文地址:https://www.cnblogs.com/3sss/p/4781533.html
Copyright © 2020-2023  润新知