ES6 let和const 命令
ES6 let 和 const 命令
- 1. 变量声明
- 2. 变量提升问题
- 3. 暂时性死区(TDZ)
- 4. 块级作用域
- 4.1 为什么需要块级作用域?
- 4.2 ES6的块级作用域
- 4.3 块级作用域和函数声明
1. 变量声明
ES5 只有两种声明变量的方法:var
命令和function
命令。
ES6 新增了let
命令和const
命令声明变量。
let
命令声明变量,声明的变量只能在let
命令所在的代码块中有效。用法类似于var
命令,只不过var
命令声明的变量在全局范围内有效。
如果在代码块之内使用let
命令声明了变量,而在代码块之外调用该变量,则会报错。
const
命令声明一个只读的常量,一旦声明,常量的值就不能改变,所以在声明时必须进行初始化赋值,否则会报错。
注意:
let
命令和const
命令不允许在相同作用域内重复声明同一个变量。const
命令和let
命令声明的变量只在声明的块级作用域内有效。var
命令可以重复声明变量,后声明的变量覆盖先声明的变量。
这里补充说明一下在JS中var
命令声明的变量作用域:
- 在函数外声明的变量是全局变量,如果没有用
var
命令明确声明的,则变量是全局对象window
的可配置属性,可以使用delete
删除,有用var
命令明确声明的变量是不可配置的全局属性,无法删除。 - 在函数内部使用
var
命令声明的变量为局部变量,没有使用var
命令明确声明的变量为全局变量。
2. 变量提升问题
变量提升问题,即变量是否可以在声明之前使用。
var
命令声明的变量会发生变量提升,即变量可以在声明之前使用,值为undefined
。
let
命令和const
命令声明的变量不存在变量提升问题,即所声明的变量一定要在声明后使用,否则报错。
3. 暂时性死区(TDZ)
ES6规定,如果区块中存在let
和const
命令,这个区块对于它们声明的变量就会形成封闭作用域,它们声明的变量不再受外部的影响,必须在声明之后才能被获取和使用。凡是在声明之前就访问这些变量,就会报错。
暂时性死区的解释:(暂时性死区:temporal dead zone,简称TDZ)
解释1:当程序的运行流程进入作用域创建变量,到变量可以被访问之间的一段时间,就称之为“暂时性死区”。
解释2:在代码块内,使用let命令声明变量之前,该变量都是不可用的。这在语法上,称为“暂时性死区”。
4. 块级作用域
4.1 为什么需要块级作用域?
ES5 只有全局作用域和函数作用域,没有块级作用域,这带来很多不合理的场景。
第一种场景,内层变量可能会覆盖外层变量。
var tmp = new Date();function f() {console.log(tmp);if (false) {var tmp = 'hello world';}
}f(); // undefined
上面代码的原意是,if
代码块的外部使用外层的tmp
变量,内部使用内层的tmp
变量。但是,函数f
执行后,输出结果为undefined
,原因在于变量提升,导致内层的tmp
变量覆盖了外层的tmp
变量。
第二种场景,用来计数的循环变量泄露为全局变量。
var s = 'hello';for (var i = 0; i < s.length; i++) {console.log(s[i]);
}console.log(i); // 5
上面代码中,变量i
只用来控制循环,但是循环结束后,它并没有消失,泄露成了全局变量。
4.2 ES6的块级作用域
ES6的块级作用域必须有大括号,如果没有大括号,JavaScript 引擎就认为不存在块级作用域。
ES6 允许块级作用域的任意嵌套。如果存在多层嵌套,则每一层都是一个单独的作用域。
4.3 块级作用域和函数声明
ES5 规定,函数只能在顶层作用域和函数作用域之中声明,不能在块级作用域声明。
ES6允许在块级作用域中声明函数,在块级作用域中,函数声明语句的行为类似于let
,在块级作用域之外不可引用。
书籍链接:ECMAScript6 入门
相关文章:

jQuery的Tab插件 Tabtastic
Tabtastic 是一个 jQuery 用来实现 Tab 窗体的插件,支持 Tab 嵌套以及动态内容加载。 下面是源文件下载:Tabtastic转载于:https://www.cnblogs.com/zhulidong/archive/2009/11/01/1593753.html

另类×××应用(三):不花一分钱,实现总部和多分支机构网络互联
[本文高清PDF版,在文章最后的附件提供下载,欢迎下载查阅] 【需求分析】(一)我们面临的问题。Freesky公司是一家在台湾和大陆都有很多分支机构的大饼油条连锁经销商,大陆总部在宁波,在宁波、温州、上…

[SDOI2017]天才黑客
传送门 Description 给出一张带边权的有向图,每个边都上都有一个字符串(给出对应Trie树上的节点),一条路径的长度为路径上的边权之和相邻两条边的字符串的lcp长度之和。 求从1到其它节点的最短路 Solution 预备部分 首先&#…

spine - unity3D(摘自博主softimagewht)
摘自:(博主 http://www.cnblogs.com/softimagewht/p/4149118.html) //skeletonDataSkeletonAnimation skeletonAnimation GetComponent<SkeletonAnimation>();Debug.Log(skeletonAnimation.name);//获取角色名Debug.Log(skeletonAnima…

Windows搜索工具 — Everything
everything 主页 :https://www.voidtools.com/zh-cn/ Everything:是 Windows 上一款搜索引擎,它能够基于文件名快速定文件和文件夹位置。 下载链接:https://www.voidtools.com/zh-cn/downloads/ —— END ——

向访客和爬虫显示不同的内容
为了提高网页的用户体验, 我们经常会做一些对搜索引擎不太友好的事情, 但某些情况下这并不是无法挽回的, 可以通过向自然人和搜索引擎机器人显示不同的内容来提供好的用户体验和 SEO. 听说本方法会触犯搜索引擎的一些操作原则, 有可能被被各搜索引擎处罚, 甚至删除网站. 所以我…

php取url后的文件名
<? $a"http://www.esyu.com.cn/images/aaa.gif"; echo substr($a,strrpos($a,"/")1); ?>

ES6 函数的扩展
ES6 函数的扩展1. 函数参数的默认值1.1 基本用法1.2 与解构赋值默认值结合使用1.3 参数默认值的位置1.4 函数的length属性2. rest参数2.1 rest参数2.2 arguments对象3. 函数的name属性4. 箭头函数1. 函数参数的默认值 1.1 基本用法 ES6之前,不能直接为函数的参数指…

Mycat分片规则详解
1、分片枚举 通过在配置文件中配置可能的枚举 id,自己配置分片,本规则适用于特定的场景,比如有些业务需要按照省份或区县来做保存,而全国省份区县固定的,这类业务使用本条规则,配置如下: <ta…

COGS 2769. mk去撸串
【题目描述】 今天 mk 去撸串 ,恰逢店里活动 ,如果吃一种串串超过记录, 可以 赠送 328, 所以 mk 想知道他吃的串串中吃的最多的种类是什么. 【输入格式】 第一行一个整数 1<n<50000; 然后有 n 行长度<100 的全部由小写字母组成的字符串;每个代表一种串串 【输出格式】…

C# 使用HttpWebRequest提交ASP.NET表单并保持Session和Cookie
由于种种原因,我们有时需要从互联网上抓取一些资料,有些页面可以直接打开,而有些页面必登录之后才能打开。本文介绍的是使用 HttpWebRequest 和 HttpWebResponse 自动填写提交 ASP.NET 表单并保持 Session 和 Cookie 的一个完整的例子。这里涉…

rman备份后为什么要同时备份归档日志
今天在CU上看到有人问一个问题:rman备份后为什么要同时备份归档日志呢,既然rman是物理备份,所有数据已经都备份,再次备份归档日志何用?思考了一下,认为有必要记录一下为什么要备份归档日志:其实…

Angular响应式表单及表单验证
1. 什么是响应式表单? 响应式表单提供了一种模型驱动的方式来处理表单输入,其中的值会随时间而变化。 响应式表单使用显示的,不可变的方式,管理表单在特定时间点上的状态。对表单状态的每一次变更都会返回一个新的状态ÿ…

void *指针的加减运算
1、手工写了一个程序验证void *指针加减运算移动几个字节: //本程序验证空类型指针减1移动几个字节 #include <stdio.h> int main(int argc, char *argv[]) {int a10,b20;int *pa&a;void …

ASP.NET运行原理
一个ASP.NET的应用程序是开始于IIS的. 当你请求一个包含ASP.NET应用的网址时,IIS接受到请求(IIS是WEB服务守候进程),IIS收到请求后,会根据请求者请求的主机头或者IP或者端口号来找到对应的站点. 当找到站点后,如果你请求的资源是以ASPX为结尾的WEBFORM,时,IIS会将控制权交给一…

vue 树形下拉框 亲测 好用
https://vue-treeselect.js.org/ 顺带说一个开发中使用这个组件遇到的问题,关于回显之后无法修改的问题 找了很长时间 原因是数据类型导致的问题,数组里面应该是数字类型,直接转数组的话里面的值都是字符串,所有得额外做处理了转…

通过xmanager远程连接redhat linux as 5
通过xmanager远程连接redhat linux as 5 <?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />rhel5与rhel4不同的地方是,rhel5里没有/etc/X11/gdm/这个目录,rhel5的gdm的配置文件放在这里/usr/share/gdm/defa…

bzoj 1264: [AHOI2006]基因匹配Match (树状数组优化dp)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id1264 思路: n大小为20000*5,而一般的dp求最长公共子序列复杂度是 n*n的,所以我们必须优化。 题目说了一个数会出现5次,那么我们可以预处理得到 第一个序列a[]每…

C语言第二次博客作业---分支结构
C语言第二次博客作业---分支结构 一,PTA实验作业 题目1.计算分段函数 本题目要求计算下列分段函数f(x)的值 1.代码 double x, result;scanf("%lf", &x);if (x >0)result sqrt(x);elseresult pow( x 1, 2) 2 * x 1 / x;printf ("f(%.2f) …

Lazy.NET
.NET 4.0里,在System名称空间中多了一个名为Lazy<T>新泛型类,该类的作用正如其名称所示。下面给出了一个使用的例子:1 var lazy newLazy<IList<OrderRow>>(2 () >3 {4 var rows //get order rows;5 returnrows;6 });7 8…

Angular 组件交互
Angular 组件交互 组件交互: 组件通讯,让两个或多个组件之间共享信息。 使用场景: 当某个功能在多个组件中被使用到时,可以将该特定的功能封装在一个子组件中,在子组件中处理特定的任务或工作流。 交互方式࿱…

java-在应用中获取spring定义的bean
因为写了些bean作为quartz的任务用spring配置了,但有些时候需要在别的类中使用这些bean,没有太仔细去研究spring,依稀记得有个getBean,到网上g了一把,发现方法不止一种,选了一种最简单的方法: 主…

Enterprise Architect 7 入门教程 1
一. 简介生命周期软件设计方案——Enterprise Architect是以目标为导向的软件系统。它覆盖了系统开发的整个周期,除了开发类模型之外,还包括事务进程分析,使用案例需求,动态模型,组件和布局,系…

FCS省选模拟赛 Day5
传送门 Solution Code #include<bits/stdc.h> #define ll long long #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) inline int read() {int x0,f1;char chgetchar();while(ch<0||ch>9){if(ch-)f-1;chgetchar();}while(ch>…

python中的单例模式
单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。 比如,某个服务器程序的…

JavaScript 数据类型转换
1. typeof 操作符 使用typeof操作符来检测变量的数据类型。 使用方式:typeof 变量名 或者 typeof(变量名) 返回结果: number、string、boolean、object、undefined、function typeof {} // 返回object typeof [] // 返回object typeof null // 返回o…

Cisco asa 5510升级IOS和ASDM
Cisco asa <?xml:namespace prefix st1 ns "urn:schemas-microsoft-com:office:smarttags" />5510升级IOS和ASDMshow version 查看当前运行的系统信息,包括启动文件(即IOS)等 show boot 查看当…

Angular 服务
服务的概念 服务是在多个“互相不知道”的类之间共享信息的好办法。—— 官方文档 可以理解为组件中需要的数据源是由服务提供的,也可以理解为组件类中的方法通过调用服务中的方法向服务器请求数据。 Injectable() 服务 服务类需要导入Injectable符号并需要加上Inj…

[Linux] 029 脚本安装包
1. 脚本安装包 脚本安装包并不是独立的软件包类型,常见安装的是源码包是人为把安装过程写成了自动安装的脚本,只要执行脚本,定义简单的参数,就可以完成安装非常类似于 Windows 下软件的安装方式2. Webmin 的作用 Webmin 是一个基于…

基于Android平台扫码识别并链接服务器demo
资料在我的网盘:Android文件夹 第一:开发平台搭建。 本项目采用Android studio(android-studio-bundle-162.4069837-windows.exe)作为开发平台,安装JDK(jdk-8u144-windows-x64.exe)。 下载对…