博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于es6中let的相关问题
阅读量:4657 次
发布时间:2019-06-09

本文共 1258 字,大约阅读时间需要 4 分钟。

  之前通过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

  

转载于:https://www.cnblogs.com/3sss/p/4781533.html

你可能感兴趣的文章
杭电多校 Harvest of Apples 莫队
查看>>
C/C++心得-结构体
查看>>
函数名作为参数传递
查看>>
apt-get for ubuntu 工具简介
查看>>
数值计算算法-多项式插值算法的实现与分析
查看>>
day8-异常处理与网络编程
查看>>
Python基础-time and datetime
查看>>
shell脚本练习01
查看>>
WPF图标拾取器
查看>>
通过取父级for循环的i来理解闭包,iife,匿名函数
查看>>
HDU 3374 String Problem
查看>>
数据集
查看>>
[Leetcode] unique paths ii 独特路径
查看>>
HDU 1217 Arbitrage (Floyd + SPFA判环)
查看>>
IntelliJ idea学习资源
查看>>
Django Rest Framework -解析器
查看>>
ExtJs 分组表格控件----监听
查看>>
Hibernate二级缓存配置
查看>>
LoadRunner常用术语
查看>>
关于jedis2.4以上版本的连接池配置,及工具类
查看>>