关于更多es6建议去看阮一峰的博客~

es6入门:http://es6.ruanyifeng.com/

源码仓库:https://github.com/ruanyf/es6tutorial

let介绍

一.块级作用域(重点)。

   我们知道,在javascript中只有全局作用域和函数作用域,并不存在块级作用域。这样,在使用时就会出现一些问题。 下面我们先来举例说明let块级作用域的使用。

   例:

  代码如下所示: 

        {
var a=5;
let b=10;
}
console.log(a);
console.log(b);

  我们在控制台得到的结果如下所示:

  也就是说,var声明的变量由于不存在块级作用域所以可以在全局环境中调用,而let声明的变量由于存在块级作用域所以不能在全局环境中调用。

二.不存在变量提升

      var定义变量:可以先使用,后声明;而let定义变量:只可先声明,后使用。

例:

  

        var num1=100;
console.log(num1); let num2=200;
console.log(num2); console.log(i);
var i=10; console.log(j);
let j=5;

    我们可以看到结果如下:

即前两个都是先声明后使用,没有问题。而后两个都是先使用,后声明,用var 声明的显示undefined,而 let声明的直接报错。

说明:console.log(i);

   var i=10;

实际上相当于:

    var i;

    console.log(i);

   i=10;

所以会出现undefined的情况。

三.暂时性死区

  暂时性死区即:只要一进入当前作用域,所要使用的变量就已经存在,但是不可获取,只有等到声明变量的那一行代码出现,才可以获取和使用该变量。

例5:

    var tmp=123;
if(true){
tmp="abc";
let tmp;
}

结果如下:

也就是说:虽然上面的代码中存在全局变量tmp,但是块级作用域内let又声明了一个局部变量tmp,导致后者绑定了块级作用域,所以在let声明变量前,对tmp赋值会报错。此即暂时性死区。

  

  注意:ES6规定暂时性死区和不存在变量提升就是为了减少运行时的错误,防止在变量声明前就使用这个变量,从而导致意料之外的行为。

  

  暂时性死区就是: 只要块级作用域内存在let,那么他所声明的变量就绑定了这个区域,不再受外部的影响。

  暂时性死区即 Temperary Dead Zone,即TDZ。 

  

       注意:暂时性死区也意味着 typeof 不再是一个百分之百安全的操作。  如下:

    if (true) {
console.log(typeof x);
let x;
}

  这里如果没有let x,那么typeof x的结果是 undefined,但是如果使用了let x,因为let不存在变量提升,所以这里形成了暂时性死区,即typeof x也是会报错的。。。  从这里可以理解暂时性死区实际上就是这一部分是有问题的 。

四.不允许重复声明

  

    function func (){
let b=100;
var b=10;
} function add(num){
let num;
return num+1;
} function another(){
let a=10;
let a=5;
}

上述三个得到的结果均为:

只是前两者为 b和num被声明过了。注意:第二个函数,虽然我们没有明确的声明,但是参数实际上是相当于用var声明的局部变量。

let应用

  • 因为闭包的存在,会给我们的应用中带来一些不必要的麻烦。比如下面的例子:

    <body>
    <input type="button" value="按钮1" >
    <input type="button" value="按钮2" >
    <input type="button" value="按钮3" >
    <script type="text/javascript">
    var btns = document.getElementsByTagName("input");
    for (var i = 0; i < 3; i++) {
    btns[i].onclick = function () {
    alert("我是第" + (i + 1) + "个按钮");
    };
    }
    </script>
    </body>

    在实际点击button的时候,弹出的都是”我是第4个按钮”,这又是为什么呢?是因为闭包导致的,给onclick赋值的函数内部已经访问了另一个外部作用域的变量i,而闭包中使用的局部变量的值,一定是局部变量的最后的值。因此点击的时候,总是会读取i的最后一个值3,因此造成了每次点击都是“第4个按钮”。

  • 遇到这种问题,有三种解决方式供参考。

  • 方式1:给每个按钮添加一个属性,来保存每次i的临时值。
    <body>
    <input type="button" value="按钮1" >
    <input type="button" value="按钮2" >
    <input type="button" value="按钮3" >
    <script type="text/javascript">
    var btns = document.getElementsByTagName("input");
    for (var i = 0; i < 3; i++) {
    //把i的值绑定到按钮的一个属性上,那么以后i的值就和index的值没有关系了。
    btns[i].index = i;
    btns[i].onclick = function () {
    alert("我是第" + (this.index + 1) + "个按钮");
    };
    }
    </script>
    </body>
  • 方式2:使用匿名函数的自执行
    <body>
    <input type="button" value="按钮1" >
    <input type="button" value="按钮2" >
    <input type="button" value="按钮3" >
    <script type="text/javascript">
    var btns = document.getElementsByTagName("input");
    for (var i = 0; i < 3; i++) {
    //因为匿名函数已经执行了,所以会把 i 的值传入到num中,注意是i的值,所以num
    (function (num) {
    btns[i].onclick = function () {
    alert("我是第" + (num + 1) + "个按钮");
    }
    })(i);
    }
    </script>
    </body>

    方式3:使用es6新增的let声明变量i

    <body>
    <input type="button" value="按钮1" >
    <input type="button" value="按钮2" >
    <input type="button" value="按钮3" >
    <script type="text/javascript">
    var btns = document.getElementsByTagName("input");
    for (let i = 0; i < 3; i++) {
    btns[i].onclick = function () {
    alert("我是第" + (i + 1) + "个按钮");
    };
    }
    </script>
    </body>

es6 let介绍及应用场景的更多相关文章

  1. Redis常用数据类型介绍、使用场景及其操作命令

    Redis常用数据类型介绍.使用场景及其操作命令 本文章同时也在cpper.info发布. Redis目前支持5种数据类型,分别是: 1.String(字符串) 2.List(列表) 3.Hash(字 ...

  2. 小D课堂-SpringBoot 2.x微信支付在线教育网站项目实战_6-2.申请微信支付介绍和不同场景的支付方式

    笔记 2.申请微信支付介绍和不同场景的支付方式         简介:介绍微信商户平台,支付方式和使用场景,申请微信支付流程                  1.什么是微信商户平台:        ...

  3. 小D课堂 - 新版本微服务springcloud+Docker教程_6-01 微服务网关介绍和使用场景

    笔记 第六章 微服务网关zuul开发实战 1.微服务网关介绍和使用场景     简介:讲解网关的作用和使用场景 (画图)          1)什么是网关         API Gateway,是系 ...

  4. MySQL主从复制介绍:使用场景、原理和实践

    MySQL主从复制介绍:使用场景.原理和实践 MySQL数据库的主从复制方案,和使用scp/rsync等命令进行的文件级别复制类似,都是数据的远程传输,只不过MySQL的主从复制是其自带的功能,无需借 ...

  5. 【memcache缓存专题(1)】memcache的介绍与应用场景

    简介 Memcached是一个高性能的分布式的内存对象缓存系统,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各 ...

  6. key-list类型内存数据引擎介绍及使用场景

    “互联网数据目前基本使用两种方式来存储,关系数据库或者key value.但是这些互联网业务本身并不属于这两种数据类型,比如用户在社会化平台中的关系,它是一个list,如果要用关系数据库存储就需要转换 ...

  7. Redis学习笔记(4)——Redis五大数据结构介绍以及应用场景

    出处:https://www.jianshu.com/p/f09480c05e42 Redis是典型的Key-Value类型数据库,Key为字符类型,Value的类型常用的为五种类型:String.H ...

  8. Java 四种引用介绍及使用场景

    强引用-FinalReference 介绍: 强引用是平常中使用最多的引用,强引用在程序内存不足(OOM)的时候也不会被回收,使用方式: String str = new String("s ...

  9. Fiddler(一)Fiddler介绍及应用场景

    Fiddler是一款网络抓包工具,抓包可以是抓取电脑端请求的数据,还可以抓取移动端(手机APP)的数据包,可以监控HTTP和HTTPS的流量,可以通过浏览器或者客户端软件向服务器发送的HTTP或者HT ...

随机推荐

  1. 【RSR】RSR如何配置BGP与BFD联动(动态路由)

    应用场景 企业租用运营商MSTP线路,配置BGP路由协议上网,由于企业本端出口路由器无法检测到运营商中间链路通信中断,导致路由收敛缓慢,无法快速的切换到其它备份线路,此时可以在路由器上启用BGP与BF ...

  2. 13 Spring 的事务控制

    1.事务的概念 理解事务之前,先讲一个你日常生活中最常干的事:取钱.  比如你去ATM机取1000块钱,大体有两个步骤:首先输入密码金额,银行卡扣掉1000元钱:然后ATM出1000元钱.这两个步骤必 ...

  3. spring框架学习(三)——AOP( 面向切面编程)

    AOP 即 Aspect Oriented Program 面向切面编程 首先,在面向切面编程的思想里面,把功能分为核心业务功能,和周边功能. 所谓的核心业务,比如登陆,增加数据,删除数据都叫核心业务 ...

  4. machine learning相关会议

    1. ICML(International Conference on Machine Learning)   链接:https://en.wikipedia.org/wiki/Internation ...

  5. java接口幂等性校验

    关于接口幂等性的概念: 幂等性:同一接口调用多次(使用相同的参数),对系统的影响是相同的. 怎样才是对系统有影响? 有影响--->增删改操作,修改一个用户信息,删除用户与某人的关联关系,生成一个 ...

  6. linq 动态排序 order by

    项目查询数据库使用的是linq 语法,可是后期需要用到不同字段的排序.各种纠结! 在网上找了各种资料 后面才找到两种方法 using System; using System.Collections. ...

  7. CLASSPATH 环境变量设置

    当 JVM 运行时,如果设置了 CLASSPATH 变量,那么 JVM 会到该目录下寻找 java 类文件 该变量配置的方式不同,寻找顺序也不同 在我的 D:\tmp\java\quickstart\ ...

  8. python day 9: xlm模块,configparser模块,shutil模块,subprocess模块,logging模块,迭代器与生成器,反射

    目录 python day 9 1. xml模块 1.1 初识xml 1.2 遍历xml文档的指定节点 1.3 通过python手工创建xml文档 1.4 创建节点的两种方式 1.5 总结 2. co ...

  9. JS中的函数与对象

    创建函数的三种方式 1.函数声明 function calSum1(num1, num2) { return num1 + num2; } console.log(calSum1(10, 10)); ...

  10. JAVA基础之ServletContext对象

    个人理解:  ServletContext类似字节码文件对象,在web创建的时候就自动生成了,并且是唯一的,跟随着项目和服务器共存亡了.通过这个对象,我们可以向里面存数据(键值对),也可以通过别的Se ...