ES6新增了let命令,用于声明变量。其用法类似var,区别是使用let命令声明的变量只在当前代码块有效。

for循环的计数器就很适合使用let命令。

var arr= [1,2,3,4,5];
for(var i=0;i<arr.length;i++){
//something to do...
}
alert(i); //运行结果为5,但如果使用let,会报错i is not defined

下面的代码如果使用var,最后将输出10;

 var a = [];
for(var i = 0;i<10;i++){
a[i] = function(){
alert(i);
}
}
var func = a[7];
func();

这是因为变量i使用var声明,在全局范围内有效,每次循环新的i值就会覆盖旧值。

而如果使用let声明变量,i只在本次循环中有效,所以以下代码的输出结果为7。

 var a = [];
for(let i = 0;i<10;i++){
a[i] = function(){
alert(i);
}
}
var func = a[7];
func();

使用let声明变量,变量一定要在声明后使用,不然会报变量未定义的错误。

 console.log(str);
var str = "111" //undefined
// let str = "111"; //str is not defined

上面的代码如果使用var声明变量str,仅仅会输出变量undefined。而使用let命令声明,则会抛出str is not defined异常。

只要块级作用域内存在let命令,它所声明的变量就“绑定”这个区域,不再受外部的影响。ES6规定,如果区块中存在let和const命令,则这个区块对这些命令声明的变量从一开始就形成封闭作用域,只要在声明之前使用这些变量就会报错。这在语法上称作“暂时性死区”(temporal dead zone)。

 var tmp = 123;
if(true){
tmp = "abc"; //tmp is not defined
let tmp; //将声明的变量绑定到这个区域,不再受外部影响
}

查看代码运行效果

参考阮一峰《ES6标准入门》

ES6中的let命令的更多相关文章

  1. ES6中新增let命令使用方法

     在ES6中新增了let命令,该命令的用法与var 类似,但是所声明的变量只能在let命令所在的代码块(最接近let 命令的大括号内)中有效果.但是let 又有一些不同于var 的特性. 1.let定 ...

  2. ES6中的const命令【转】

    1.const声明一个只读常量,一旦声明,常量的值就不能改变 1 const PI=3.1415; 2 console.log(PI);//3.1415 3 4 PI=3;//Uncaught Typ ...

  3. ES6中的const命令

      1.const声明一个只读常量,一旦声明,常量的值就不能改变 1 const PI=3.1415; 2 console.log(PI);//3.1415 3 4 PI=3;//Uncaught T ...

  4. JavaScript学习系列5 ---ES6中的var, let 和const

    我们都知道JavaScript中的var,在本系列的 JavaScript学习系列2一JavaScript中的变量作用域 中,我们详细阐述了var声明的变量的作用域 文章中提到,JavaScript中 ...

  5. 详解ES6中的 let 和const

      前  言 JRedu ECMAScript 6 是 JavaScript 语言教程,全面介绍 ECMAScript 6 新引入的语法特性. ES6 与上一个版本 ES5 的所有不同之处,对涉及的语 ...

  6. ES6中的Symbol类型

    前面的话 ES5中包含5种原始类型:字符串.数字.布尔值.null和undefined.ES6引入了第6种原始类型——Symbol ES5的对象属性名都是字符串,很容易造成属性名冲突.比如,使用了一个 ...

  7. ES6中的模块

    前面的话 JS用"共享一切"的方法加载代码,这是该语言中最容出错且容易令人感到困惑的地方.其他语言使用诸如包这样的概念来定义代码作用域,但在ES6以前,在应用程序的每一个JS中定义 ...

  8. ES6中函数新增的方式方法

    ---恢复内容开始---   绪 言 ES6 大家对JavaScript中的函数都不陌生.今天我就为大家带来ES6中关于函数的一些扩展方式和方法. 1.1函数形参的默认值 1.1.1基本用法 ES6 ...

  9. ES6中export , export default , import模块系统总结

    最近在学习使用Webpack3的时候发现,它已经可以在不使用babel的情况下使用ES6的模块加载功能了. 说到ES6的模块加载功能,我们先复习一下CommonJS规范吧: 一  . CommonJS ...

随机推荐

  1. freeswitch黑名单mod_blacklist使用

    freeswitch自带黑名单模块"mod_blacklist",此文只是对该模块简单使用的实例. 最近接到客户投诉有大量骚扰电话,而从源头查不太容易,因此想到的笨方法是将投诉人加 ...

  2. 磁盘操作系统 cmd命令

    DOS CMD :磁盘操作系统 不区分大小写 **cd \ 根目录 cls 清空屏幕 dir 显示目录 d: 进入D盘 cd 进入目录命令 dir 查看当前目录的文件与目录 del 删除文件 del ...

  3. Android SDK的下载与安装

    一.Android SDK简介 Android SDK(Software Development Kit,软件开发工具包)被软件开发工程师用于为特定的软件包.软件框架.硬件平台.操作系统等建立应用软件 ...

  4. 第三章 C#程序结构[3.2 选择结构的应用(Windows窗体应用程序)(四)]

    [案例]设计一个顾客选购商品的系统.其中,顾客身份有两类,一类是VIP,另一类是普通会员:商品种类有3种.分别是上衣.裤子和鞋子.其中,VIP享受8折优惠和商店赠送的礼品,而普通会员都不享受.单击[确 ...

  5. Caused by: io.protostuff.ProtobufException: Protocol message contained an invalid tag (zero).

    [ERROR] com.xxxx.redis.RedisClientTemplate.getOject(RedisClientTemplate.java:60):http-bio-8080-exec- ...

  6. lavarel 中间件

    创建中间件 php artisan make:policy UserPolicy 所有生成的授权策略文件都会被放置在 app/Policies 文件夹下. 让我们为默认生成的用户授权策略添加 upda ...

  7. jenkins中如何实现执行脚本时的变量共享

    1.主要是利用EnvInject Plugin插件,所以要首先安装插件,安装好后如下图: 2.然后在“增加构建步骤”中,插入一个“Execute Python script” 代码我用的python3 ...

  8. No input file specified.

    no input file specified 解决方法 2018年02月23日 14:25:07 tiramisuer8023 阅读数:36607   版权声明:本文为博主原创文章,未经博主允许不得 ...

  9. oracle user_tables没有新创建的表的问题

    oracle 新创建表后,在user_tables没有,在user_tab_columns也没有,暂时未找到办法

  10. 算法实践--最小生成树(Prim算法)

    前一篇介绍了一种最小生成树的算法--Kruskal算法,本篇介绍另一种Prim算法 算法描述 定义V为端点的集合,A为最小生成树,初始为空.对于每个端点v初始的Key[v]=∞, Parent[v]= ...